Java 7中钻石操作员的要点是什么?

问题:

java 7中的钻石操作符允许代码如下:

List<String> list = new LinkedList<>();

但是在Java 5/6中,我可以简单地写:

List<String> list = new LinkedList();

我对类型擦除的理解是这些完全一样。 (一般在运行时被删除)。
为什么要钻石呢?它允许什么新的功能/类型的安全?如果它不产生任何新的功能,为什么他们提到它作为一个功能?我对这个概念的理解有缺陷吗?

回答:

的问题

List<String> list = new LinkedList();

是在左侧,您使用generic类型List<String>,右侧您使用raw类型LinkedList。 Java中的原始类型有效地仅存在于与泛型代码的兼容性,并且不应该在新的代码中使用,除非
你绝对必须
现在,如果Java从一开始就有泛型,并且没有类似于LinkedList的类型,它们最初是在具有泛型之前创建的,那么它可能已经使得它使得通用类型的构造函数自动推断其类型参数如果可能,从作业的左边。但它没有,它必须以不同的方式对待原始类型和通用类型以实现向后兼容性。这使得他们需要使用slightly different但同样方便的方式来声明一个通用对象的新实例,而不必重复其类型参数…钻石操作符。
就您的List<String> list = new LinkedList()的原始示例而言,编译器会为此分配生成警告,因为必须。考虑这个:

List<String> strings = ... // some list that contains some strings

// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);

存在泛型以提供编译时保护,不做错事。在上面的例子中,使用原始类型意味着你没有得到这个保护,并会在运行时收到错误。这就是为什么你不应该使用原始类型。

// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);

然而,钻石操作员允许将作业的右侧定义为具有与左侧相同类型参数的真实通用实例,而无需再次键入这些参数。它允许您使用almost保持泛型的安全性与使用原始类型相同。
我认为要了解的关键是,原始类型(没有<>)不能被视为与通用类型相同。当你声明一个原始类型时,你不会得到泛型的好处和类型检查。你还必须记住,generics are a general purpose part of the Java language …他们不仅仅适用于Collection的无参考构造函数!

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What is the point of the diamond operator in Java 7?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

58 − = 57