ここ1週間ほどAIに「ジェネリクスを使ったプログラムのお題をください」とお話をしてそれに苦戦していた。
ようやくソースコードが記述できる程度には理解は及んだので自らがしていた勘違いを是正して言語化しようと思う。
別にジェネリクスに限った話ではない。
言語化といえば格好つけた表現だが、正直私がお題に対してソースコードを書いている時、何が分からないのかが分からない状況だった。
つまり理解に至った経緯という形での話は難しい。その為理解できた事、今後も解釈が変わる余地があること、という体で当記事を書く。
正直未だにジェネリクスには型制限、境界の辺りで困惑している。
インスタンスはそれぞれ固有の振る舞いとフィールドを持っている
正直これが一番大きかったと思っている。
getterやsetterを記述できるようになっていながら、何故インスタンスを生成するのか。何故そのインスタンスにアクセスするのか分かっていなかった節がある。これが分かったおかげで処理を追いかけるのが遥かに楽になったし、ソースコードの記述の際、クラス単位ではなくインスタンス単位で考える為のきっかけを得たように感じる。
データ型の一致について
当然だがInteger = String;等という記述はできない。だが変数名でそれらを扱う上で自らが何のデータ型を扱っているか見失い、そういった記述をしてしまうことがある。
私が行なったのはうろ覚えだがBox[Integer]を記述したbox[i] = name;といった形式に近いものだったように思う。今見れば出来ないのは当然だがつい一週間ほど前はこういった文を当然のように記述していた。これからも頻度は減るだろうが行うことがあろう。Arraylist.addメソッドも同様。
加えて酷く些細なことだが
Integer num;という箱(恐らくこれはインスタンスの生成だが、そこまで考えると頭が今は爆発してしまう)の宣言とnum = 10;という行為がインスタンスという箱とInteger型の参照値の格納という見え方に変わったのは良いことだと思う。これは基本データ型ではないから、当然なのだが。この考え方はint型配列の見方を変えてくれた。int[]型の箱というインスタンスにint型データを連続した形で格納できるという見え方に変わった。おそらく少し前は文法以上の見え方はしていなかったように思う。
補足:
7/3本日もジェネリクスについてちょっとだけやっていたところ、型固着という言葉を知る(AI曰く)。つまり、ジェネリクスを例えばInteger型でインスタンス化した時クラス記載の型推論がIntegerに切り替わった結果、メソッドにつけているも詳細は不明だが、に切り替わるような現象のことらしい。書きながら「これ別にフィールド使ってないしstaticでいいかもなあ。でもまだstaticよく知らんしなぁ」と思いながら書いていた辺り、成長は見られる。