gpt4 book ai didi

java - 类型 安全警告

转载 作者:行者123 更新时间:2023-12-02 00:26:49 26 4
gpt4 key购买 nike

在 Maurice Naftalin 和 Philip Wadler 所著的 Java Generics and Collections 一书中,我遇到了泛型的局限性并产生了疑问。也许书里已经回答了这个问题,但我想我很困惑。
在以下代码中:

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

这里不会发出警告,但如上一个 block 中所写,如果我写:

   List<?> sample= Arrays.asList(1,2,3,4.14);

发出警告。为什么?

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

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

提前致谢。

最佳答案

存在编译时异常,因为 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>并且您正在尝试在其中添加一个数字。因此,为了避免这种错误(并且因为验证是在编译时完成的),如果您不确定它是否有效,则不能添加内容。

<小时/>

关于你的警告,我没有任何警告。

关于java - 类型 安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9837544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com