Java チュートリアル ( http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html ) で、次のように表示されました。
// Not really allowed.
List<String>[] lsa = new List<String>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Unsound, but passes run time store check
oa[1] = li;
// Run-time error: ClassCastException.
String s = lsa[1].get(0);
If arrays of parameterized type were allowed, the previous example
would compile without any unchecked warnings, and yet fail at run-time
// OK, array of unbounded wildcard type.
List<?>[] lsa = new List<?>[10];
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
// Correct.
oa[1] = li;
// Run time error, but cast is explicit.
String s = (String) lsa[1].get(0);
彼らは、切り替えれば大丈夫だと説明しList<String>[] lsa = new List<String>[10];
まし
List<?>[] lsa = new List<?>[10];
たが、アップキャストする必要があります。
私の教授はこれについて次のように尋ねました:「なぜ後者はコンパイルするのですか?」
「引数が ? の場合、意味は、配列内のすべてのセルに ArrayList を含めることができるということです。ジェネリック クラスの型に関する仮定がないため、前の例外は発生しません。」
ワイルドカードが機能し、前のものは機能しないということは、私にはまだ本当に意味がありません。ワイルドカードの例でアップキャストを強制する必要がある場合、最初の例でもそれを実行できないのはなぜでしょうか?
誰かが私のためにこれを片付けてくれれば幸いです。