gpt4 book ai didi

java - 此声明中原始类型和泛型类型有什么区别

转载 作者:行者123 更新时间:2023-12-01 11:29:05 26 4
gpt4 key购买 nike

此声明中原始类型和泛型类型有什么区别

List<Integer> list1 = new ArrayList<>();

List<Integer> list2 = new ArrayList();

对于这些声明我做不到

list1.add("hello");
list2.add("hello");

那么区别在哪里

换句话说,第一个声明中尖括号的好处是什么

最佳答案

当你说ArrayList<>(),时尖括号中的类型是从声明中推断出来的,因此它解析为 ArrayList<Integer>在编译时。

如果省略尖括号,则赋值使用原始类型,即没有任何元素类型信息的集合类型。编译器不会为此赋值执行任何类型推断。

这两行都不会编译:

list1.add("hello")
list2.add("hello")

因为 list1list2变量声明为 ArrayList<String>

指定 <> 的要点就是 ArrayList() 的赋值至ArrayList<String>应该生成未检查赋值的编译器警告,因为编译器无法验证 = 右侧的原始类型集合标志仅包含 Integer s。在像您这样的简单情况下,您可以直观地控制代码的正确性。但考虑一个更复杂的场景:

ArrayList rawList = new ArrayList();
rawList.add("one");

ArrayList<Integer> list = rawList;

在这里,您通过分配一个包含 String 的原始列表来破坏通用系统。到应仅包含 Integer 的类型化列表变量s。这就是未经检查赋值的编译器警告派上用场的地方。

关于java - 此声明中原始类型和泛型类型有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30571025/

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