当前位置: 首页 > 知识库问答 >
问题:

Java中菱形操作符()的意义是什么?

夹谷和韵
2023-03-14

java 7中的菱形运算符允许以下代码:

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

然而,在Java 5/6中,我可以简单地编写:

List<String> list = new LinkedList();

我对类型擦除的理解是,它们完全相同。(无论如何,泛型会在运行时被删除)。

为什么要为钻石而烦恼呢?它允许哪些新功能/类型的安全性?如果它不能产生任何新的功能,为什么他们会把它作为一个功能提出来?我对这个概念的理解有缺陷吗?

共有3个答案

濮俊美
2023-03-14

这一行会导致[unchecked]警告:

List<String> list = new LinkedList();

因此,问题变了:为什么只有在创建新集合的情况下,[unchecked]警告才会被自动抑制?

我想,这将是一个更加困难的任务,然后添加

UPD:我还认为,如果“仅仅为了几件事”使用原始类型是合法的,那就太乱了。

邹缪文
2023-03-14

你的理解有点缺陷。菱形操作符是一个很好的功能,因为你不必重复自己。在声明类型时定义一次类型是有意义的,但在右侧再次定义它是没有意义的。干燥原理。

现在来解释定义类型的所有模糊之处。在运行时删除该类型是正确的,但一旦您想要从具有类型定义的列表中检索某个对象,您就可以在声明该列表时将其恢复为您定义的类型,否则它将丢失所有特定功能,并且仅具有对象功能,除非您将检索到的对象强制转换为其原始类型,这样可以有时会非常棘手,并导致ClassCastException。

使用<代码>列表

薛淮晨
2023-03-14

与的问题

List<String> list = new LinkedList();

在左手边,您使用的是泛型类型List

现在,如果Java从一开始就有泛型,而没有在有泛型之前创建的类型,例如LinkedList,那么它可能已经创建了泛型,以便泛型类型的构造函数可以在可能的情况下从赋值的左侧自动推断其类型参数。但事实并非如此,它必须以不同的方式对待原始类型和泛型类型,以实现向后兼容性。这使得他们需要使用一种稍微不同但同样方便的方式来声明泛型对象的新实例,而不必重复其类型参数。。。钻石操作员。

至于你最初的List的例子

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

泛型的存在是为了提供编译时保护,防止出错。在上面的示例中,使用raw类型意味着您没有得到这种保护,并且在运行时会出现错误。这就是为什么不应该使用原始类型。

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

然而,菱形运算符允许将赋值的右侧定义为真正的泛型实例,其类型参数与左侧相同。。。无需再次输入这些参数。它允许你保持泛型的安全性,几乎和使用原始类型一样。

我认为需要理解的关键是原始类型(没有

 类似资料:
  • 问题内容: Java 7中的菱形运算符允许如下代码: 但是,在Java 5/6中,我可以简单地编写: 我对类型擦除的理解是这些完全相同。(无论如何,泛型都会在运行时删除)。 问题答案: 是在左侧,你使用的是通用类型,而在右侧,你使用的是原始类型LinkedList。Java中的原始类型实际上仅存在于与前泛型代码的兼容性,并且除非绝对必要,否则绝对不能在新代码中使用。 现在,如果Java从一开始就具

  • 问题内容: 我有一个类型为Patient_class的arraylist,并且用黄色下划线标出了arraylist类型,IDE提到了“新表达式中的冗余类型参数(使用菱形运算符)”。 我的问题是:我应该改用菱形运算符吗?是必须的吗?将记录存储到arraylist时,是否会丢失数据或出现其他任何问题? 这是我的数组列表: 老实说,我不知道钻石经营者实际上是什么。 问题答案: Diamond运算符的目的

  • 考虑这个java代码,它试图实例化一些<代码>列表< /C> 和很简单;在Java7中使用新的菱形运算符来减少类型参数的不必要重复。 是使用匿名类的的变体,可能会重写的某些方法。 试图使用菱形运算符,类似于list2,但这是一个编译错误 产生一个错误,证明编译器知道实际需要什么类型。错误消息是类型不匹配:无法从新ArrayList转换 那么,有了的声明,为什么菱形运算符不能与匿名类一起使用呢?这里

  • 我尝试使用Google Search和Stack ;Overflow进行搜索,但没有显示任何结果。我在opensource库代码中看到了这一点: “=”()是什么意思?

  • 问题内容: 我不是很了解门面的意义。 如果我有此代码,然后有这样的EJB。 这有什么意义呢?为什么称其为立面?对我来说,这只是一个抽象类,对相似的功能进行了分组。谢谢。 问题答案: 外观是一种设计模式。模式(一种软件模式)是一组规则,用于组织代码并为其提供特定的结构。通过使用模式可以实现某些目标。设计应用程序时使用设计模式。 Facade模式允许程序员为对象创建一个简单的接口以使用其他对象。考虑使

  • 问题内容: 我正在读一本关于Java的书,它说您可以将整个类声明为final。我想不出我会在哪里使用它。 我只是编程的新手,我想知道程序员是否真的在他们的程序上使用了它。如果他们这样做了,他们什么时候使用它,以便我可以更好地理解它,并知道何时使用它。 如果Java是面向对象的,并且您声明了一个类final,它是否会停止具有对象特征的类的想法? 问题答案: 如果他们这样做了,他们什么时候使用它,以便