1

Javaで、クラス型を指定する引数を必要とせずに、ジェネリックメソッド内でジェネリック型を使用する方法があるかどうか疑問に思いました。これを行う通常の方法は次のとおりです。

public <T> T doSomethingGeneric(Class<T> type, int a) {
    return (T) doSomethingElse(type, a);
}

代わりにこれをお願いします:

public <T> T doSomethingGeneric(int a) {
    return (T) doSomethingElse(/* some magic with T here */, a);
}

背景:Hibernateを使用してユーティリティメソッドを作成しています。これが私が実際にやろうとしていることの例であり、それがこの問題にどのように適用されるかを推測することができます。

public static <M extends Model> M get(Class<M> type, Serializable id) {
    Session session = newSession();
    Transaction t = session.beginTransaction();
    Object model = null;
    try {
        model = session.get(type, id);
        t.commit();
    } catch (HibernateException ex) {
        t.rollback();
        throw ex;
    }
    return (M) model;
}

これは可能ですか?もしそうなら、それはどのように行われますか?ありがとう!

4

2 に答える 2

4

Class<T>実行時に渡すために取得したいdoSomethingElse()ですか?いいえ、それは不可能です。

doSomethingElseが必要な理由を説明する場合Class<T>は、回避策を提案できます。

于 2013-02-28T20:39:08.373 に答える
2

これは不可能ですdoSomethingGeneric。C++でのテンプレートのインスタンス化とは異なり、のコードは1回だけコンパイルされます。タイプTは処理中に消去Objectれます。

(T)未チェックのダウンキャストとしてフラグが立てられることにも注意してください。

于 2013-02-28T20:39:00.503 に答える