我想爲返回結果的JSE應用程序創建JPA事務。如何指定泛型類型作爲函數參數
@SuppressWarnings("unchecked")
public static <T> T transaction(EmWorker worker, Class<T>clazz){
EntityManager em = createEntityManager();
em.getTransaction().begin();
// >>> My Functional interface
Object result = worker.work(em);
em.getTransaction().commit();
em.close();
return (T)result;
}
它適用於讀取單個對象:
FunkoPop gandalf=EmFactory.transaction( eManager -> {
return eManager.find(FunkoPop.class, 1);
}, FunkoPop.class);
但現在,我想的FunkoPop
一個List
。
List<FunkoPop> list =EmFactory.transaction( e -> {
String query = "SELECT f FROM FunkoPop f ";
List<FunkoPop> l = e.createQuery(query, FunkoPop.class).getResultList();
return l;
}, List<FunkoPop>.class); //Won't compile ; or List.class gives warnings
transaction
需要兩個參數:lambda和class。我近似理解,我無法捕獲類型List<FunkoPop>.class
,因爲此參數將丟失通用的<FunkoPop>
。什麼是沒有警告的解決方案?
你應該使用'clazz.cast(結果)'而非'(T)result'。然後,你不需要'@SuppressWarnings(「unchecked」)'。不過,這隻適用於可授權類型,不適用於'List'。但是什麼是EmWorker?製作該類型的泛型(或者用Function '替換它)將消除所有這些特技的需求。 –
Holger