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

标签 java generics syntax

我开始学习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/

相关文章:

java - 如何将 java ArrayList 转换为数组?

java - 是否可以使用key和partition来消费kafka消息?

Java 泛型,未绑定(bind)通配符 <?> 与 <Object>

javascript - === 是否存在于 jquery 中

perl - 这些 "open"格式有什么区别

java - 带有网络驱动器的类路径来运行Java程序

java - 使用 DisplayTag 时如何自定义 paging.banner.some_items_found

具有关联类型的 Swift 协议(protocol)(类型查找不明确)

java - 没有为带有 Comparator<Map.Entry 的 TreeMap 找到合适的构造函数

css - css 变量名可以以数字开头吗?