【发布时间】:2012-08-08 11:19:01
【问题描述】:
我已经研究泛型一个小时了,我有一些疑问。假设我有这样的课程:
class Pair<T>
{
public T getFirst() { return first; }
}
基本上我的书是这样说的:
类型擦除:类型变量被擦除并替换为它们的边界类型(或 无边界变量的对象。)
所以根据我的书的说法,JVM中的代码应该是这样的:
class Pair
{
public Object getFirst() { return first; }
}
现在如果我这样做:
Pair<String> pair = new Pair<>(); //I use Java 7 diamond syntax here.
pair.getFirst()
我的代码是否需要再次从Object 转换为String 以返回getFirst 类型?
现在考虑:
ArrayList<String> files = new ArrayList<>();
同一本书说的(相对于上面的代码是):
....the files contain array of Strings.
对于上面ArrayList 的示例,我对类型擦除规则感到非常困惑。在这种情况下,files 数组怎么会知道它有 String 数组? (这与类型擦除规则相矛盾)
编辑:
为了查看Pair 的结果代码(这就是类型擦除发生的方式),我如何在此处使用javap 工具?
我在这里遗漏了什么吗?
【问题讨论】:
-
在运行时,文件数组不知道它包含字符串,但编译器在编译时知道。
-
@MattR 看到它在编译时知道,它必须在运行时知道。两者之间信息不丢失
-
编译器可能会被欺骗接受不同类型的数组,并且只有当您尝试从数组中获取元素时才会出现异常。检查此以获取更多详细信息:stackoverflow.com/q/11610421/1384984
-
@James 类型已被删除,因此如果您愿意,可以称其为“丢失”:-) 它是一个对象数组,但如果它在运行时不包含字符串,则确实会引发异常
-
“编译器可能被欺骗接受不同类型的数组” 。