簡體   English   中英

如何調用沒有參數的泛型方法?

[英]how to call generic method with no parameters?

我需要編寫不獲取任何參數並返回List java通用方法。 此通用方法用於休眠:

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>);

如何調用此方法?

您忘記了這個:

mgr.<User>list()

我相信您要完成的工作需要一些重構。 似乎您正在嘗試創建一個通用的Dao類,可以重用該類來查詢任何Model對象。 問題在於,如果不將類傳遞給方法,則無法在運行時獲取<T>泛型的類型。

一種實現所需目標的方法是創建一個基礎dao,該基礎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();

由於使用了泛型,它可能與“類型擦除”有關。 你打電話時

T.class.getName()

T類型在運行時間之前被擦除。 它在運行時不可用,僅在編譯時使用以確保類型安全。 您可能需要編寫一些代碼以在運行時獲取持久性類的類型,然后在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,在構造時將其設置為參數類型,然后在需要時將該persistantClass放在類中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM