gpt4 book ai didi

java - 使用 `new` 实例化泛型时,是否包含类型参数之间有什么实际区别?

转载 作者:行者123 更新时间:2023-11-29 07:28:02 25 4
gpt4 key购买 nike

我开始学习Java了,在我的程序中出现了

Stack<Integer> s = new Stack<Integer>();

Stack<Integer> s = new Stack<>();

Stack<Integer> s = new Stack();

全部编译并生成我期望的输出。

有什么实际区别吗?哪个更受欢迎?

最佳答案

Stack<Integer> s = new Stack<Integer>();

当首次引入泛型时,Java 5 和 Java 6 中需要这种形式。然而,自 Java 7 以来,它比必要的更冗长。

Stack<Integer> s = new Stack<>();

这种形式是在Java 7中引入的,和上面的是等价的,只是编译器会推断出类型,这样程序员就不需要重复了。 这是首选形式。

Stack<Integer> s = new Stack();

这是使用原始类型 并且很糟糕。允许与 Java 5 之前的版本向后兼容,但编译器会提示原始 Stack 的分配。到一般类型的 Stack<Integer>是“未经检查的转换”。

在这个例子中并不能立即清楚类型安全性正在丢失,因为尽管 Stack创建的是原始 Stack<Object> , 未引用原文,原始 Stack举行,Stack不允许您传递参数来填充它,但这可能会发生在另一种类型上,例如 ArrayList :

List<Integer> numbers = List.of(12, 34, 56);
List<String> names = new ArrayList(numbers); // "unchecked conversion" warning
for (String name : names) { // ClassCastException
System.out.println(name);
}

即使是 Stack如果我们把创建和赋值分开,问题就很清楚了:

Stack rawStack = new Stack();           // create Stack of raw types
Stack<String> typedStack = rawStack; // "unchecked conversion" to
// strongly-typed Stack
rawStack.push(123); // push an Integer
typedStack.pop(); // ClassCastException

在这种情况下,我们保留了对原始原始堆栈的引用,这让我们违反了类型安全。你可能会说,“好吧,我永远不会这样做,”但是创建强类型的替代方案是,new Stack<>() , 只是另外两个字符。

关于java - 使用 `new` 实例化泛型时,是否包含类型参数之间有什么实际区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47467145/

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