【问题标题】:class java.lang.Class cannot be cast to class java.lang.reflect.Parameterized类 java.lang.Class 不能转换为类 java.lang.reflect.Parameterized
【发布时间】:2021-12-28 20:19:36
【问题描述】:

Java 11

我需要在运行时获取泛型类型。

这里是客户端代码:

     var dataTemplateClient = new DataTemplateJdbc<Client>(dbExecutor, entitySQLMetaDataClient); 

    public class Client {
        @Id
        private Long id;
        private String name;
    }

这里的代码:

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

    public class DataTemplateJdbc<T> implements DataTemplate<T> {
        private final DbExecutor dbExecutor;
        private final EntitySQLMetaData entitySQLMetaData;
    
        public DataTemplateJdbc(DbExecutor dbExecutor, EntitySQLMetaData entitySQLMetaData) {
            this.dbExecutor = dbExecutor;
            this.entitySQLMetaData = entitySQLMetaData;
            ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
            Type type = genericSuperclass.getActualTypeArguments()[0];
        }

但我在这一行得到错误:

ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();

错误:

Exception in thread "main" java.lang.ClassCastException: class java.lang.Class cannot be cast to class java.lang.reflect.ParameterizedType (java.lang.Class and java.lang.reflect.ParameterizedType are in module java.base of loader 'bootstrap')
    at mypackage.DataTemplateJdbc.<init>(DataTemplateJdbc.java:26)

【问题讨论】:

  • 那行不通。 DataTemplateJdbc&lt;T&gt; 没有通用超类,它扩展了 Object。您需要FooClass extends DataTemplateJdbc&lt;Something&gt; 才能从中获取泛型类型(来自FooClass)。
  • 你想要的都是不可能的。所有getGenericX 的东西充其量只会让你T。只是字面意思:“名称为 T 的无边界类型变量”。如果这是可能的,你不认为 java 会让它更容易上手吗?

标签: java generics


【解决方案1】:

基本上,您尝试做的事情是行不通的。您无法在运行时获取与 T 关联的实际类型。

当您在 DataTemplateJdbc 上调用 getClass() 时,它将为您提供代表已擦除类型的 Class 对象。这就是所有可用的。

类型转换必然会失败。 Class 永远不能表示参数化类型1


1- Java 编译器无法知道这一点。就编译器而言,Class 实现了 Type,它是 `ParameterizedType 的超类型。它“认为”类型转换可以成功......所以它不会将其标记为编译错误。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-06-21
    相关资源
    最近更新 更多