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