gpt4 book ai didi

java - 获取抽象父类(super class)上泛型类型参数的实际类型

转载 作者:搜寻专家 更新时间:2023-10-30 20:55:02 24 4
gpt4 key购买 nike

我有一个类:

public abstract class BaseDao<T extends PersistentObject> {

protected Class<T> getClazz() {
return T.class;
}

// ...

}

但是编译器对 T.class; 说:Illegal class literal for the type parameter T

如何获取T类?

最佳答案

绝对有可能从 Class#getGenericSuperclass() 中提取出来因为它不是在运行时定义的,而是在编译时由 FooDao extends BaseDao<Foo> 定义的.

这是一个启动示例,您可以如何在抽象类的构造函数中提取所需的泛型父类(super class)型,同时考虑子类的层次结构(以及将其应用于泛型 EntityManager 方法的实际用例,而无需需要明确提供类型):

public abstract class BaseDao<E extends BaseEntity> {

@PersistenceContext
private EntityManager em;

private Class<E> type;

@SuppressWarnings("unchecked") // For the cast on Class<E>.
public BaseDao() {
Type type = getClass().getGenericSuperclass();

while (!(type instanceof ParameterizedType) || ((ParameterizedType) type).getRawType() != BaseDao.class) {
if (type instanceof ParameterizedType) {
type = ((Class<?>) ((ParameterizedType) type).getRawType()).getGenericSuperclass();
} else {
type = ((Class<?>) type).getGenericSuperclass();
}
}

this.type = (Class<E>) ((ParameterizedType) type).getActualTypeArguments()[0];
}

public E find(Long id) {
return em.find(type, id);
}

public List<E> list() {
return em.createQuery(String.format("SELECT e FROM %s e ORDER BY id", type.getSimpleName()), type).getResultList();
}

// ...
}

关于java - 获取抽象父类(super class)上泛型类型参数的实际类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18707582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com