Maurice Naftalin、Philip Wadler による本 Java Generics and Collections で、私は Generics の制限を経験していて、疑問に思いました。それは本で答えられているかもしれませんが、私はかなり混乱していると思います.
次のコードでは:
List<List<?>> lists = new ArrayList<List<?>>();
lists.add(Arrays.asList(1,2,3));
lists.add(Arrays.asList("four","five"));
assert lists.toString().equals("[[1, 2, 3], [four, five]]");
本で述べられているように、ネストされたワイルドカードのインスタンス化は問題ありません。最初の list では、リスト型のオブジェクトが含まれることがわかっているからです。
しかし、上記のコードを変更しようとしたところ、1 つの警告と 1 つのコンパイル時エラーが発生しました。私はやろうとしました:
List<?> sample= Arrays.asList(1,2,3,4.14);
List<List<?>> lists = new ArrayList<List<?>>();
lists.add(Arrays.asList(1,2,3));
lists.get(0).add(5);
lists.add(Arrays.asList("four","five"));
System.out.println(sample.toString());
assert lists.toString().equals("[[1, 2, 3], [four, five]]");
私の質問は次のとおりです。1)最初の行に次のように書いた場合:
List<?> sample= Arrays.asList(1,2,3);
ここでは警告は発行されませんが、前のブロックに書かれているように、次のように書いた場合:
List<?> sample= Arrays.asList(1,2,3,4.14);
警告が発行されます。なんで?
2) 4 行目にコンパイル時エラーがあるのはなぜですか。
lists.get(0).add(5);
前もって感謝します。