在Maurice Naftalin,Philip Wadler撰寫的「Java泛型和收集」一書中,我遇到了泛型限制,並提出了疑問。可能是書中的答案,但我認爲我很困惑。
在下面的代碼:
類型安全警告
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<?> 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)爲什麼會出現在第四行編譯時間錯誤:
lists.get(0).add(5);
預先感謝。
報告的警告和錯誤是什麼? – WhiteKnight 2012-03-23 10:30:36