在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