entityclass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 为null
时间: 2024-06-05 07:08:28 浏览: 144
这个问题涉及到Java的泛型机制。这段代码的意思是获取当前类的泛型类型参数,并将其赋值给entityclass变量。但是如果当前类没有定义泛型类型参数,就会导致这里获取的泛型参数为null。可能的原因是你在使用这段代码的时候,没有给当前类定义泛型类型参数,或者定义的方式不正确。你可以检查一下当前类是否定义了泛型,如果有,确保定义方式正确。
相关问题
public BaseDAO() { //getClass() 获取Class对象,当前我们执行的是 //new FruitDAOImpl() 创建的是FruitDAOImpl的实例 //那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法 //因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class //所以getGenericSuperclass()获取到的是BaseDAO的Class Type genericType=getClass().getGenericSuperclass(); //ParameterizedType参数化类型 Type[] actualTypeArguments=((ParameterizedType) genericType).getActualTypeArguments(); //获取到<T>中的T的真实的类型 Type actualType=actualTypeArguments[0]; try { entityClass = Class.forName(actualType.getTypeName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } }
这段代码是实现了一个通用的DAO类,称为BaseDAO。它的构造方法通过getClass()方法获取当前实例的Class对象,再通过getGenericSuperclass()方法获取父类的Class对象,从而得到实际的参数化类型(ParameterizedType),最终通过getActualTypeArguments()方法获取<T>中的T的真实类型,并用Class.forName()方法得到它的Class对象,存储在entityClass字段中。如果在过程中发生了ClassNotFoundException,就抛出一个RuntimeException。
我加入了这个规则,getClass().getGenericSuperclass() 获取到的类型还是Class
如果你在一个普通类中调用 `getClass().getGenericSuperclass()` 方法,它返回的类型是 `Type`。而如果你在一个泛型类中调用该方法,它返回的类型是 `ParameterizedType`。
如果你想获取到泛型超类的类型,你需要先将 `Type` 转换成 `ParameterizedType`,然后调用 `getActualTypeArguments()` 方法获取泛型参数的实际类型。例如:
```java
public abstract class BaseDao<T> {
private Class<T> entityClass;
public BaseDao() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
this.entityClass = (Class<T>) paramType.getActualTypeArguments()[0];
}
}
```
在上面的代码中,我们首先通过 `getClass().getGenericSuperclass()` 方法获取到当前类的超类的类型,然后将其强制转换成 `ParameterizedType` 类型。接着,我们调用 `getActualTypeArguments()` 方法,获取泛型参数的实际类型的数组,并通过 `[0]` 取得第一个泛型参数的实际类型,即为实体类的类型。最后,我们将实体类的类型保存到 `entityClass` 字段中。
阅读全文