如何调用没有参数的泛型方法?

时间:2012-02-03 18:42:40

标签: java hibernate generics

我需要编写没有参数的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>);

如何调用此方法?

3 个答案:

答案 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就在类中。