2012-04-19 30 views
0

我有幾個功能...如何鞏固這些功能集成到一個通用的

@Override 
public List<ContentType> findAllContentTypes() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("ContentType.findAll", ContentType.class) 
        .getResultList(); 
} 

@Override 
public List<Status> findAllStatus() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("Status.findAll", Status.class) 
        .getResultList(); 
} 

其實我對這些是獲得各種不同的東西12。我想採取這些功能,並使一個通用函數來取代所有這些。

我能想到做到這一點的最佳方式是做類似findAll("Language")的事情。我開始做...

public List<T> findAll(String objectName) { 
    return this.emf.createEntityManager() 
        .createNamedQuery(objectName+".findAll", objectName) 
        .getResultList(); 
} 

的問題(比我的IDE與扔不知道如何處理T做一個合適的除外)是,我不知道如何把這個字符串,並將它傳遞到位ContentType.class

我錯過了什麼,阻止Netbeans識別T

objectName工作的方式我通過它作爲第二個參數createNamedQuery()

回答

4

您需要通過在方法返回類型之前添加類型參數列表(在這種情況下爲<T>)將方法聲明爲泛型。然後,只需傳遞正確的類型作爲參數的類對象:

public <T> List<T> findAll(Class<T> clazz) { 
    return this.emf.createEntityManager().createNamedQuery(
      clazz.getSimpleName()+".findAll", clazz).getResultList(); 
} 
+0

你能解釋爲什麼我需要有'公共名單'而不只是'公開名單'? – Webnet 2012-04-19 19:30:19

+1

因爲你需要指出''的類型是什麼類型,你可以強制T擴展另一個類如下:''。通過聲明'',你表明它可以是擴展對象的任何類型(即所有類型) – 2012-04-19 19:32:02

+0

難題!此外,'contentDao.findAll(「用戶」)或'contentDao.findAll(新用戶())'似乎不是這個功能正在尋找... – Webnet 2012-04-19 19:32:45

2

像這樣的東西應該做的伎倆:

public <T> List<T> findAll(Class<T> klass) { 
    return this.emf.createEntityManager().createNamedQuery(klass.getSimpleName()+".findAll", klass).getResultList(); 
}