我有一个采用泛型的抽象类,在这个类中有一些方法。
我的问题是我不能在方法内部使用泛型 E。
public abstract class AbstractRepository<E> implements Repository<E> {
final Class<E> typeParameterClass;
public AbstractRepository(Class<E> typeParameterClass) {
this.typeParameterClass = typeParameterClass;
}
...
@Override
public E findById(Integer id) {
try {
this.entityManager.find(typeParameterClass, id);
} catch (IllegalArgumentException error) {
error.printStackTrace();
} catch (PersistenceException error) {
error.printStackTrace();
}
return null;
}
我尝试使用泛型 E 作为“find()”的参数,如下所示,但我收到一条错误消息,指出 E 未定义。
@Override
public E findById(Integer id) {
try {
this.entityManager.find(E, id);
} catch (IllegalArgumentException error) {
error.printStackTrace();
} catch (PersistenceException error) {
error.printStackTrace();
}
return null;
}
为了解决这个问题,我使用了 typeParameterClass。
typeParameterClass 是扩展 AbstractRepository 的每个其他类都必须传递的参数,这个参数是类本身,但它似乎不正确,因为我已经有了泛型类。
现在的例子:
@Repository
public class UserRepository extends AbstractRepository<User> {
public UserRepository(){
super(User.class);
}
...
}
那么,有没有办法在方法内部使用泛型 E?
Repository 是一个也采用通用 E 的接口(interface)。
我将 Spring 与 Hibernate 结合使用。
最佳答案
Java 在运行时不存在泛型类型信息,因此无法确定用于具体实例的类型参数。
所以处理这个问题的唯一方法是通过 Class
参数,就像您所做的那样,因为这些设计用于在运行时携带类型信息,并具有自引用通用参数,这就是为什么您可以确保使用的类类型属于您的类型 E
通过将其声明为 Class<E>
.同样,所有泛型类型参数都只是编译器的糖分,并在运行时被删除(因此它们只能确保没有人编写传递实例中非 E
类的代码)。
关于java - 如何在方法中使用类的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40152632/