【问题标题】:Type Safety warning类型 安全警告
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    lists.get(0).add(5);

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

    【讨论】:

      【解决方案3】:

      因为lists.get(0) 返回了List&lt;?&gt;,所以存在编译时异常

      你不知道这个列表的类型是什么,你知道你可以从中获取元素(它至少是一个Object)但是你不能在里面放任何东西(因为你不是确保它适合。

      如果你改写会追加什么:

      List<List<?>> lists = new ArrayList<List<?>>();
      lists.add(new ArrayList<String>());
      lists.get(0).add(5);
      lists.add(Arrays.asList("four","five"));
      

      您有一个ArrayList&lt;String&gt;,并且您正尝试在其中添加一个数字。所以只是为了避免这种错误(并且因为验证是在编译时完成的),如果你不确定它是否会起作用,你不能添加东西。


      关于你的警告,我没有。

      【讨论】:

        猜你喜欢
        • 2021-03-27
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        相关资源
        最近更新 更多