Javaのジェネリクスについて調べていると、以下のような記事を目にしました。
以下引用です。(http://qiita.com/pebblip/items/1206f866980f2ff91e77)
コンパイル時に型情報は消去される
パラメータ化された型や、型パラメータの持つ型情報はコンパイラによって消去される。これは型消去(type erasure)と呼ばれる。
例えば、以下の型変数Tを持つジェネリック型を考える。
ContainerはIntegerやBigDecimalなどのNumber型のみの値を保持するコンテナクラス。
class Container<T extends Number> { private T value; public Container(T value) { this.value = value; } public T get() { return value; } }
コンパイラは、上記のクラスから型情報を消去し、以下のクラスと同等のクラスを生成する。
class Container { private Number value; public Container(Number value) { this.value = value; } public Number get() { return value; } } ```型情報といっても実際に消去するわけではなく、型パラメータはその上限境界の型(上の例ではNumber)に置換される。 このように、型情報はコンパイラによって消去されるため、実行時には型情報を取得することはできない。 よくわからないのですが、上の例でいうと、Container<Integer>としていても、下のコードのように型パラメータは全てNumberになるのでしょうか。 回答お願いします。 補足です。 コンパイル時には型情報というのは消えてしますようですね。 しかしながら、例えばインスタンスとして、以下のように呼び出したとします。 ```Container<Integer extends Number> c = new Container<>(3); System.out.println(c.get());
そうすると、getメソッドの返り値はInteger型になると思います。
これは呼び出すときに、<Integer extends Number>としているので、JVMが返り値がInteger型であることを認識してくれるからですね。
ここまでは理解できましたが、そうすると、なぜインスタンスを生成することはできないのでしょうか。
class Illegal<T> { public T create() { return new T(); } }
このコードのようにしてインスタンスを生成することはできないというのはなぜでしょうか。
呼び出す側できちんと情報はあるはずなので、インスタンスを生成し、返すことは可能だと考えられるのですが。。
回答5件
あなたの回答
tips
プレビュー