Java 7中的菱形运算符允许如下代码:
List<String> list = new LinkedList<>();
但是,在Java 5/6中,我可以简单地编写:
List<String> list = new LinkedList();
我对类型擦除的理解是这些完全相同。(无论如何,泛型都会在运行时删除)。
List<String> list = new LinkedList();
是在左侧,你使用的是通用类型List<String>
,而在右侧,你使用的是原始类型LinkedList。Java中的原始类型实际上仅存在于与前泛型代码的兼容性,并且除非绝对必要,否则绝对不能在新代码中使用。
现在,如果Java从一开始就具有泛型,并且没有LinkedList最初在具有泛型之前创建的类型(例如),则它可能已经做到了,这样泛型类型的构造函数会自动从左侧推断出其类型参数-尽可能在作业的另一侧。但事实并非如此,为了向后兼容,必须对原始类型和泛型类型进行不同的处理。这使得他们需要采取一种稍微不同但同样方便的方式来声明泛型对象的新实例,而不必重复其类型参数……菱形运算符。
就你的原始示例而言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);
但是,菱形运算符允许将赋值的右侧定义为具有与左侧相同类型参数的真实泛型实例,而不必再次键入这些参数。它使你可以与使用原始类型几乎相同的工作来保持泛型的安全。
我认为关键要理解的是,原始类型(不带<>
)不能与泛型类型相同。声明原始类型时,不会获得任何好处和泛型的类型检查。你还必须记住,泛型是Java语言的通用组成部分 ……它们不仅仅适用于Collections 的无参数构造函数!
问题内容: 我有一个类型为Patient_class的arraylist,并且用黄色下划线标出了arraylist类型,IDE提到了“新表达式中的冗余类型参数(使用菱形运算符)”。 我的问题是:我应该改用菱形运算符吗?是必须的吗?将记录存储到arraylist时,是否会丢失数据或出现其他任何问题? 这是我的数组列表: 老实说,我不知道钻石经营者实际上是什么。 问题答案: Diamond运算符的目的
java 7中的菱形运算符允许以下代码: 然而,在Java 5/6中,我可以简单地编写: 我对类型擦除的理解是,它们完全相同。(无论如何,泛型会在运行时被删除)。 为什么要为钻石而烦恼呢?它允许哪些新功能/类型的安全性?如果它不能产生任何新的功能,为什么他们会把它作为一个功能提出来?我对这个概念的理解有缺陷吗?
两者的区别是什么 和 当我创建一个新的ArrayList时,钻石操作员是必要的吗?
问题内容: 我见过有人在代码中使用运算符。我在属性中也看到了这一点:似乎没有什么比这更好的了 那么,使用运算符的理由是什么? 问题答案: JavaScript 运算符用于显式返回undefined。它是一元运算符,意味着只能使用一个操作数。您可以如下所示使用它-独立使用或带括号。 让我们看一些例子 如果您问为什么只需要返回undefined而不是返回就需要一个特殊的关键字:原因是在ES5之前,您实
考虑这个java代码,它试图实例化一些<代码>列表< /C> 和很简单;在Java7中使用新的菱形运算符来减少类型参数的不必要重复。 是使用匿名类的的变体,可能会重写的某些方法。 试图使用菱形运算符,类似于list2,但这是一个编译错误 产生一个错误,证明编译器知道实际需要什么类型。错误消息是类型不匹配:无法从新ArrayList转换 那么,有了的声明,为什么菱形运算符不能与匿名类一起使用呢?这里