【发布时间】:2016-10-20 11:03:39
【问题描述】:
我有一个采用泛型的抽象类,在这个类中有一些方法。
我的问题是我不能在方法中使用泛型 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。
我正在使用 Spring 和 Hibernate。
【问题讨论】:
-
我看不出你的两个版本的
findById()有什么区别。 -
也许这可以帮助stackoverflow.com/questions/3403909/… ...但总的来说...这是工作中的类型擦除。
-
@FlorianAlbrecht 我忘了更改第二个,现在它是对的。
-
@GhostCat 这些解决方案和我的差不多。
标签: java spring hibernate generics