gpt4 book ai didi

分配给泛型类型的 Java 原始类型值运行时 getClss() 方法错误

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:52 24 4
gpt4 key购买 nike

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
  1. 为什么 b.get() 没有触发运行时错误?
  2. 为什么只有在尝试获取类变量的类时才会出现运行时错误?

更准确地说:为什么编译器第二个 get() 将checkcast 指令插入字节码 (导致异常)?

最佳答案

请注意:

  • 在第一种情况下,get() 的结果用于println(Object):换句话说:接收方需要一个 Object,并且“条件”将永远为真。
  • 在第二种情况下,将对返回的对象调用方法。现在,如果返回的类型是预期的类型,它会产生巨大的不同。因此,编译器正在添加此检查以保证以下方法调用合理

作为背景,可以查看 Java 语言规范,第 5.52 章:

The cast is a checked cast.

Such a cast requires a run-time validity check. If the value at run time is null, then the cast is allowed. Otherwise, let R be the class of the object referred to by the run-time reference value, and let T be the erasure (§4.6) of the type named in the cast operator. A cast conversion must check, at run time, that the class R is assignment compatible with the type T, via the algorithm in §5.5.3.

分别是第5.53章Checked Casts at Run Time .

关于分配给泛型类型的 Java 原始类型值运行时 getClss() 方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45757141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com