0

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);

前もって感謝します。

4

3 に答える 3

3

lists.get(0)を返すため、コンパイル時の例外があります。List<?>

このリストの型が何かはわかりません。そこから要素を取得できることはわかっていますが (少なくとも になりますObject)、何も入れることはできません (それが収まるかどうかわからないため.

代わりに書いた場合、何が追加されますか:

List<List<?>> lists = new ArrayList<List<?>>();
lists.add(new ArrayList<String>());
lists.get(0).add(5);
lists.add(Arrays.asList("four","five"));

があり、ArrayList<String>それに数値を追加しようとしています。したがって、この種の間違いを避けるために (また、コンパイル時に検証が行われるため)、動作するかどうかわからない場合は追加できません。


あなたの警告に関して、私は何も持っていません。

于 2012-03-23T10:33:40.920 に答える
0

1)この行は警告を出すべきではありません(試してみると出ません)。どの警告が表示されますか?

lists.get(0)2) の型がList<?>ではなくであるため、コンパイル時エラーが発生しますList<Integer。これは、リストに整数を含めることが許可されているかどうかをコンパイラが認識していないことを意味します...

于 2012-03-23T10:31:55.267 に答える
0

2) 4 行目にコンパイル時エラーがあるのはなぜですか。

list.get(0).add(5);

List> lists = new ArrayList>(); を定義したためです。リストに単純な整数 5 を追加しようとしています。そのため、IDE でコンパイル エラーが発生します。

于 2012-03-23T10:32:36.293 に答える