gpt4 book ai didi

java - Java 中菱形运算符 (<>) 的作用是什么?

转载 作者:行者123 更新时间:2023-12-01 18:14:18 24 4
gpt4 key购买 nike

java 7 中的菱形运算符允许使用如下代码:

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

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

List<String> list = new LinkedList();

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

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

最佳答案

问题

List<String> list = new LinkedList();

在左侧,您使用的是通用类型 List<String>在右侧您使用的是 raw 类型 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 语言的通用部分...它们不仅仅适用于 Collection 的无参数构造函数。 !

关于java - Java 中菱形运算符 (<>) 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60405616/

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