Java 17中无法将Class转换为ParameterizedType的问题求助
问题原因分析
你的代码抛出ClassCastException,核心原因是泛型擦除和当前类结构的问题:
当直接实例化Generic<String>时,运行时g.getClass()得到的是Generic类的原始Class对象,它的父类是Object.class(并非参数化类型)。此时getGenericSuperclass()返回的是Class类型,强行转成ParameterizedType自然会触发类型转换异常。
解决方案
方案1:用匿名内部类保留泛型信息
Java中匿名内部类会在编译阶段将泛型参数写入字节码,运行时可以通过反射获取到这些信息。修改实例化方式即可:
class GenericTypeTest { @Test void showsTheError() { // 用匿名内部类实例化,保留泛型参数信息 Generic<String> g = new Generic<String>() {}; assertEquals(String.class, g.getType()); } static class Generic<T> { Class<?> getType() { Type type = getClass().getGenericSuperclass(); ParameterizedType paramType = (ParameterizedType) type; return (Class<?>) paramType.getActualTypeArguments()[0]; } } }
方案2:构造方法传入Class对象(推荐)
如果不想依赖反射的不确定性,可以直接在构造Generic时传入泛型对应的Class对象,这种方式更直观且性能更稳定:
class GenericTypeTest { @Test void showsTheError() { Generic<String> g = new Generic<>(String.class); assertEquals(String.class, g.getType()); } static class Generic<T> { private final Class<T> type; public Generic(Class<T> type) { this.type = type; } Class<T> getType() { return type; } } }
内容的提问来源于stack exchange,提问作者Elegant.Obj
相关产品推荐
相关产品推荐

