在 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 ,它知道它将包含列表类型的对象。
但是我尝试修改上面的代码并提出了一个警告和一个编译时错误。我试着做:
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);
提前致谢。