【发布时间】:2017-08-18 12:51:18
【问题描述】:
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
- 为什么
b.get()没有触发运行时错误? - 为什么只有在我尝试获取类变量的类时才会出现运行时错误?
更准确地说:为什么编译器在秒 get()(导致异常)仅将checkcast指令插入字节码?
【问题讨论】:
-
我假设
get只是为您提供指向 SOME 对象的指针,并且在您的示例中调用toString它,但getClass实际上检查并解析类型。你期望一个Integer,但对象是String,所以getClass在内部强制转换它并失败。 -
@GhostCat 更清晰!
-
@GhostCat 去吧。我一点也不介意。感谢改进
-
@GhostCat 是的,它将它插入第二个
get,因为类型检查来自getClass。第一行不会引发异常,因为toString由所有Object类型实现。您调用的任何尝试解析类型的方法都会引发异常。
标签: java generics casting runtime