在以下代码中:
public class Test<E> {
public E test(){
E test = (E) BigDecimal.ONE;
return test;
}
public static void main(String[] args) {
Test<String> test = new Test<>();
test.test();
test.test().getClass();
}
}
方法 test.test() 不会抛出错误,但 test.test().getClass() 会抛出“class java.math.BigDecimal无法转换为class java.lang.String”错误。此错误是在运行时触发的,而不是由 IDE 触发。
我知道Java在编译时执行类型擦除,但我不明白为什么getClass()方法会触发类型转换问题。
我想,类型擦除后的代码是这样的:
public class Test {
public Object test(){
Object test = (Object) BigDecimal.ONE;
return test;
}
public static void main(String[] args) {
Test test = new Test();
test.test();
test.test().getClass();
}
}
所以 test.test() 返回一个实际上是 BigDecimal 的对象,但是为什么 BigDecimal.getClass() 会抛出“class java.math.BigDecimal无法转换为class java.lang.String”错误?
因为
test.test().getClass();
实际上是
String t = (String)test.test();
t.getClass();