[英]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.