钻石操作符 ArrayList

3
什么是两者之间的区别?
ArrayList<Integer> list = new ArrayList<>();

并且。
ArrayList<Integer> list = new ArrayList();

创建新的ArrayList时,使用钻石操作符是必要的吗?
3个回答

6

第一句话很清晰。第二句话会生成编译警告。

钻石操作符是在Java 1.7中引入的。从Java 1.5开始,您必须编写:

ArrayList<Integer> list = new ArrayList<Integer>();

请使用左右两侧的声明,来表明泛型类型。由于泛型类型可能比仅为“Integer”更复杂,因此复制完全相同的定义非常麻烦,所以编译器添加了这个很好的特性:您只需说:“此类是泛型的,请使用赋值左侧的泛型类型”,使用“<>”标记即可。
顺便说一下最后的评论。请避免在赋值和方法定义的左侧使用具体类。以下代码会更好:
List<Integer> list = new ArrayList<>();

甚至更多
Collection<Integer> list = new ArrayList<>();

或者甚至经常
Iterable<Integer> list = new ArrayList<>();

非常详细的回答,但您能否解释一下或提供链接来阅读有关此语句的内容:“请避免在赋值和方法定义的左侧使用具体类。以下是更好的方式:…” 为什么要这样做,谢谢。 - Scaramouche

1
一个相对高级的Java主题是称为“泛型”,这就是所有<>符号的解释。
实质上,你应该始终编写


ArrayList<Integer> list = new ArrayList<>();

因为它是缩写形式。
ArrayList<Integer> list = new ArrayList<Integer>();

你需要确保两个类型参数(即“位”)匹配,否则编译器会给出警告。

写作:

ArrayList<Integer> list = new ArrayList();

创建一个可以容纳任何类型的ArrayList,当您尝试将其转换为ArrayList<Integer>时,编译器会抛出警告。
编辑:
这是一份深入指南,介绍了泛型的用途和工作原理。我不确定您是否已经完全理解它们,但值得一试。

https://docs.oracle.com/javase/tutorial/java/generics/


0

首先是参数化泛型对象的 ArrayList,由参数化泛型引用引用。

其次是非参数化非泛型对象的 ArrayList,由参数化泛型引用引用。

不,虽然在创建 ArrayList 时钻石操作符不是必需的,但强烈建议使用以避免后续出现 ClassCastException 或其他 RuntimeException


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接