我开始学习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之前的版本向后兼容,但是编译器会抱怨将raw分配Stack
给通用类型Stack<Integer>
是“未经检查的转换”。
在此示例中,尚不清楚类型安全性正在丢失,因为尽管Stack
创建的对象是raw Stack<Object>
,但未Stack
保留对原始对象的引用,并且raw保留,并且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<>()
方法只是两个额外的字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句