1

ジェネリック引数を渡すメソッドがあります。必要なメソッドを 1 つ実行するには、同じメソッドのクラス インスタンスが必要です。どうすれば入手できますか。私が使用している回避策がありますが、Classインスタンスを取得する方法を知りたいです。

私が使用しているスニペットは次のとおりです。

public <T> T readModelWithId(Class<T> c, Serializable pk) {
    // Some code here.
    T t = (T)session.get(c, pk);
    // Some code here.
    return t;
}

問題は、ジェネリック型Classの戻り値の型と同じであるため、このメソッドでインスタンスを渡したくないことです。T

4

4 に答える 4

3

そのメソッド内のようなものに到達するT.class方法はありません。したがって、セッションからモデルオブジェクトを取得するために必要なので、クラス引数を渡す必要があります。

さらに、これは少し余分な「型安全性」を追加します。呼び出し元に引数として戻り型を指定するように強制するので、返される型は「呼び出し側が期待するもの」だけではありません(ただし、これにより冗長になることに同意します)。

于 2012-08-20T14:49:56.623 に答える
2

Javaは「型消去」を使用してジェネリックスを実装しているため、これを行うことはできません。

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

一般的なDAOを実行しているようです。私はここで似たようなことをしました:

http://www.matthews-grout.co.uk/2012/01/my-generic-hibernate-dao.html

于 2012-08-20T14:52:25.547 に答える
0

キャストを使用した非ジェネリックではできなかったことを、ジェネリックで行うことはできません。コードの非ジェネリック バージョンを検討してください。

public Object readModelWithId(Class c, Serializable pk) {
    // Some code here.
    Object t = session.get(c, pk);
    // Some code here.
    return t;
}

同じ質問をします。クラス インスタンス引数を削除できますcか?

于 2012-08-20T18:27:58.547 に答える
-1

ジェネリックは、コンパイル時の型の安全性のためのものです.クラスインスタンスが必要なので、コンパイラはキャストの欠落について不平を言いません. または、ジェネリックを完全に捨てて結果をキャストすることもできます

于 2012-08-20T14:47:55.250 に答える