0

在 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);

提前致谢。

4

3 回答 3

3

有一个编译时异常,因为lists.get(0)返回一个List<?>

你不知道这个列表的类型是什么,你知道你可以从中获取元素(它至少是一个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>并且你正在尝试在其中添加一个数字。所以只是为了避免这种错误(并且因为验证是在编译时完成的),如果你不确定它会起作用,你就不能添加东西。


关于你的警告,我没有。

于 2012-03-23T10:33:40.920 回答
0

1)这条线不应该发出警告(当我尝试它时它不会发出警告)。您看到哪个警告?

2) 存在编译时错误,因为类型lists.get(0)is List<?>, not List<Integer。这意味着编译器不知道列表是否允许包含整数......

于 2012-03-23T10:31:55.267 回答
0

2)为什么第四行出现编译时错误:

列表.get(0).add(5);

因为你定义了 List> lists = new ArrayList>(); 并且您正在尝试在列表中添加简单的整数 5。这就是为什么,IDE 给出编译错误。

于 2012-03-23T10:32:36.293 回答