私はこの期間にジェネリックを勉強していますが、今日、私にとってこの謎を発見しました.
次のダミークラスを考えてみましょう:
public class Main{
public static void main(String[] args) {
Container<Integer> c = new Container<Integer>();
c.getArray(); //No Exception
//c.getArray().getClass(); //Exception
//int a = c.getArray().length; //Exception
}
}
class Container<T> {
T[] array;
@SuppressWarnings("unchecked")
Container() {
array = (T[])new Object[1];
}
void put(T item) {
array[0] = item;
}
T get() { return array[0]; }
T[] getArray() { return array; }
}
消去のため、実行時に getArray() メソッドの T[] 戻り値の型が Object[] に変換されます。これは私にとって完全に合理的です。
そのメソッドにそのままアクセスする場合 (c.getArray()) 例外はスローされませんが、返された配列でいくつかのメソッド (c.Array().getClass() など) を呼び出そうとすると、またはc.getArray().length などのフィールドにアクセスすると、次の例外がスローされます。
スレッド「メイン」での例外 java.lang.ClassCastException: [Ljava.lang.Object; [Ljava.lang.Integer; にキャストできません。
この例外がスローされるのはなぜですか? 単純な c.getArray() 呼び出しでもスローされないのはなぜですか? 単に getClass() を呼び出しているか、長さにアクセスしているのに、なぜ Integer[] にキャストしようとしているのですか? getClass() と length は Object[] でも利用できませんか?
あなたの多くの(私は願っています)そして説明的な(私もこれを願っています)答えを前もって感謝します。