我需要编写没有参数的java泛型方法并返回List
。
这个泛型方法用于hibernate:
public <T> List list() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
List result = session.createQuery("from " + T.class.getName()).list();
return result;
}
我想调用这个方法。我尝试了以下但是它会产生编译错误:
mgr.list<User>();
mgr.list()<User>;
mgr.list(<User>);
如何调用此方法?
答案 0 :(得分:7)
你忘了这一个:
mgr.<User>list()
答案 1 :(得分:4)
我相信你想要完成的事情需要进行一些重构。看起来您正在尝试创建一个通用的Dao类,您可以重用它来查询任何Model对象。问题是,如果不将类传递给方法,则无法在运行时获取<T>
泛型的类型。
实现目标的一种方法是创建一个基础dao,它由特定的实现扩展,这些实现知道它们在编译时要处理的类。
public abstract class AbstractDao<T>{
private Class<T> clazz;
public AbstractDao(Class<T> clazz){
this.clazz = clazz;
}
public List<T> list() {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
List result = session.createQuery("from " + clazz.getName()).list();
return (List<T>) result;
}
}
然后扩展课程:
class UserDao extends AbstractDao<User>{
public UserDao(){
super(User.class);
}
}
然后调用方法:
List<User> users = userDao.list();
答案 2 :(得分:1)
由于使用了泛型,它可能与“类型擦除”有关。当你打电话
T.class.getName()
在运行时间之前擦除T类型。它在运行时不可用,它仅在编译时用于确保类型安全。您可能需要编写一些代码以在运行时获取您的persitence类的类型,然后在mgr类中使用它。一个例子是
public abstract class GenericHibernateDAO<T, ID extends Serializable>
implements GenericDAO<T, ID> {
private Class<T> persistentClass;
private Session session;
public GenericHibernateDAO() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
// more methods
}
来自https://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t
这里,它有一个persistentClass,它在构造时设置为参数类型,然后在需要时,persistentClass就在类中。