結果を返すJSEアプリケーション用のJPAトランザクションを作成したいとします。ジェネリック型を関数パラメータとして指定する方法
FunkoPop gandalf=EmFactory.transaction( eManager -> {
return eManager.find(FunkoPop.class, 1);
}, FunkoPop.class);
をしかし、今、私はFunkoPop
のList
をしたい:
@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;
}
これは、単一のオブジェクトを取得するために動作します。ラムダとクラス:
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
は2つの引数を必要とします。私は近似的に、タイプList<FunkoPop>.class
をキャプチャすることができないことを理解しています。このパラメータは<FunkoPop>
ジェネリックを失います。何の警告もない解決策はありますか?
あなたは 'clazz.cast(結果)'の代わりに '(T)result'を使用する必要があります。それから '@SuppressWarnings("未チェック ")は必要ありません。それでも、それは 'List'のためのものではなく、reifiable型のためだけに機能します。しかし、EmWorkerとは何ですか?そのタイプを汎用的にする(または 'Function 'で置き換える)と、これらすべてのスタントが不要になります。 –
Holger