Java Raw Type 和泛型交互

标签 java generics types

如果我有一个 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/

相关文章:

python - 在 python 中查找类型 - TypeError 'unicode' 对象不可调用

Java 2D图形性能问题

java - 激活失败 - 适用于 Netbeans 的诺基亚 SDK

java - 空套接字输入流

c# - 从通用列表中删除一个元素

django - 来自查询集/通用 View 的下一个先前链接

java - 无法从 WebElement 转换为 List<WebElement>

java - 语法错误,插入 "EnumBody"完成

android - 将 iOS 应用程序迁移到 Android 机器架构

types - 如何设置单元格数据类型