2012-03-23 5 views
0

Java Generics and Collections by Maurice Naftalin、Philip Wadler、私はジェネリックスの制限を克服して疑念を抱いていました。それは本で答えられるかもしれないが、私は恋人を混乱させていると思う。次のコードで

タイプセーフティ警告

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

最初のリストについては、それはそれはリスト型のオブジェクトが含まれていることを知っているので、ネストされたワイルドカードのインスタンス化は、問題がないことを、本の中で言われています。

しかし、上記のコードを修正しようとしましたが、1つの警告と1つのコンパイル時エラーが発生しました。

List<?> sample= Arrays.asList(1,2,3); 

をなし警告は、ここで発行されていないが、もし、前のブロックで記述されたように:私が書く場合は最初の行で) 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]]"); 

:私はやってみました私は書く:

List<?> sample= Arrays.asList(1,2,3,4.14); 

警告が発行されます。どうして?事前に

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

ありがとう:

2)なぜ、4行目のコンパイル時にエラーがあります。

+0

報告されている警告とエラーは何ですか? – WhiteKnight

答えて

3

、あなたは(それが少なくとも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>を持っていて、追加しようとしていますaその中の数字。だから、この種の間違いを避けるために(コンパイル時に検証が行われるため)、動作しないか分からない場合は追加できません。


警告に関しては、私には何もありません。

0

1) この行には警告を表示しないでください(試しても表示されません)。どの警告が表示されますか?

2) lists.get(0)のタイプがList<?>であり、List<Integerではないため、コンパイル時エラーが発生します。

lists.get(0):これはなぜ4行目のコンパイル時にエラーが発生した)...コンパイラはリストは整数を含むように許可されているかどうかは考えていないことを

0

2を意味します。追加(5);

List> lists = new ArrayList>();を定義しているためです。 リストに単純な整数5を追加しようとしています。だからこそ、IDEはコンパイルエラーを出す。 lists.get(0)List<?>

あなたはこのリストのタイプが何であるかを知らない返すため