我有一个像这样的课程:
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>
。
这是一个启动示例,您可以如何在抽象类的构造函数中提取所需的泛型超类型,同时考虑子类的层次结构(以及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泛型来获取实际的类型? 问题答案: 可以做到,但是类型擦除可能会很困难。正如其他答案所讨论的那样,您必须成为的子类或将类型的字段添加到中,而执行此操作所需的反射代码却很复杂。 在这种情况下,我建议您解决以下问题: 由于Java对静态方法的类型推断,因此无需太多额外的样板即可构造类: 这样,您就具有完全的通用性和类型安全性,并且仍然可以
“绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”
我有一个类
问题内容: 我刚刚了解了这种美观的语法 用可能是类型的元素来清空。Java的源代码如下所示: 现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类呢? 我的意思是,到目前为止,我编码同一件事的方法是 如果删除了-parameter,我将无法执行。显然我可以 但这给了我通常的警告。好的,在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添
问题内容: 说我有一个像这样的父接口/类 还有许多实现通用类型的实现接口。 我可以使用反射来获取的情况下代表我有没有为对象。像这样: 目前,我已经作为参数传递了,但是如果可以的话,我想简化一些事情。 问题答案: 是的,尽管什么其他人说,这个信息 是 可用的,如果你有机会到子类对象。您需要与一起使用。 在您的示例中,“实际”类型参数应返回for 。
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或