質問: terateilで質問していると、ある回答者様が次のようにおっしゃっていました。 「Java言語のオブジェクト指向では、「静的な/ソースコード上の変数の/コンパイル時の型」と「動的な/インスタンスの/実行時の型」の2種類が存在する」 例えば、ジェネリクスではArrayListのように宣言しておくと、コンパイル時にはTは全てNumberに置換され、これが「静的なソースコード上の変数のコンパイル時の型」で、ArrayListのように呼び出した場合、「動的なインスタンスの実行時の型」はInteger型に成ると思います。 しかしこれって他のものでも起こりうるのでしょうか。 それと、「静的」というのは変化がない、「動的」というのは変化する、というふうに捉えてよろしいのでしょうか。 本来ならその方に追加で質問すべきだったのかもしれませんが、質問内容とズレてしまうので、こちらで質問致します。 ご存知の方、ご教授ください。
回答: そもそも「動的な型」の意味合いが他のものと違う気がしますが、ひとまず置いておきます。 動的な型・静的な型(実行時の型)という言葉は、例えば次のような例で使われます。 ``` List list = new ArrayList(); ``` この時、変数listの静的な型は`List`であり、実行時の型は`ArrayList`です。 listに対して、静的な型が持っているメソッド(addやremoveなど)は使うことができますが、そうでないメソッドはたとえ動的な型が持っているものだとしても(trimToSizeなど)使うことはできません。 さて、今あなたが提示しているジェネリクスの例はこれとはまた違った話のようです。もともとArrayListを始めとしたコレクションで、様々な型のリストを扱うためにそれまで「Objectのリスト」としていたところを、型安全性を保てるように扱う型に制限を加えられるようにした仕組みです。 例示している「TがNumberに置換される」というのはあくまでその「ArrayListのクラスという設計図を作成するにあたっての便宜上の処理」です。 そしてArrayListと書いた時点で、このクラスのTが概念上Integerとして扱われます。コンパイル時もキャストによって対応しているとはいえ、TがIntegerとして振る舞います。これはコードを書いている時点で確定します。つまり**どっちも静的な型**ということができます。