如果我有一个 Stack 类
class Stack<E> {}
现在如果我这样做:
1) Stack<Integer> s = new Stack()
2) Stack s = new Stack<Integer>()
3) Stack s = new Stack()
任何人都可以向我解释这些交互(通用<->原始)的原因吗?
我的疑问主要集中在第 1 点上。事实上,如果我这样做,赋值是不安全的,因为该堆栈可以存储 Integer 以外的类型。是的,但如果我有一个推送方法并尝试存储 一个整数以外的值,编译器会阻止我...所以当我进行不安全的操作时?
最佳答案
这三个都是完全合法的,因为 Stack
之间没有实际的运行时差异。和一个 Stack<Integer>
,但这三个都会导致编译器警告。
Stack<Integer> s = new Stack()
这将导致“未经检查的转换”警告,因为将原始类型转换为参数化类型通常是不安全的。但是,在这种情况下这样做是绝对安全的:推送 Integer
值不会导致任何错误;推非Integer
值将导致类型错误。
Stack s = new Stack<Integer>()
这是从参数化类型到原始类型的合法转换。您将能够推送任何类型的值。但是,任何此类操作都会导致“未检查的调用”警告。
Stack s = new Stack()
同样,这是合法的,没有隐式转换。您将能够推送任何类型的值。但是,任何此类操作都会导致“未检查的调用”警告。
每当您引用类型 Stack
时,您也可能会收到“原始类型”警告.
关于Java Raw Type 和泛型交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1206028/