【发布时间】:2012-04-07 21:58:02
【问题描述】:
在 Philip Wadler 的 Maurice Naftalin 所著的 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);
提前致谢。
【问题讨论】:
-
报什么警告和错误?
标签: java generics collections covariance bounded-wildcard