为什么 getClass 方法会在泛型代码中触发类型转换错误?

问题描述 投票:0回答:1

在以下代码中:

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”错误?

java generics classcastexception type-erasure
1个回答
0
投票

因为

test.test().getClass();
实际上是

String t = (String)test.test();
t.getClass();
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.