public class Box<T> {
private T t;
public Box(T t){
this.t = t;
}
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> b = new Box(new String("may be"));
System.out.println(b.get()); // successfully print out "may be"
System.out.println(b.get().getClass()); // error
}
}
此代码给出运行时错误:
exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
- why is
b.get()
不触发运行时错误?
- 为什么只有当我尝试获取类变量的类时才会出现运行时错误?
更准确地说:为什么编译器要插入一个checkcast
指令写入字节码only为了second get()
(导致异常)?
请注意:
- 在第一种情况下,结果为
get()
是用来println(Object)
:换句话说:接收方期望一个对象,并且该“条件”将始终为真。
- 在第二种情况下,method随后将调用返回的对象。现在它可以使huge如果返回的类型是expected一。因此编译器添加此检查以保证以下方法调用是sound.
作为背景知识,可以查看 Java 语言规范,第 5.52 章:
演员阵容是经过检查的演员阵容。
这样的强制转换需要运行时有效性检查。如果运行时的值为 null,则允许强制转换。否则,令 R 为运行时引用值所引用的对象的类,并令 T 为强制转换运算符中命名的类型的擦除(第 4.6 节)。强制转换必须在运行时通过第 5.5.3 节中的算法检查类 R 是否与类型 T 的赋值兼容。
分别第5.53章在运行时检查强制转换 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5.3.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)