2012-02-03 12 views
1

パラメータを取得せずにListを返すjava汎用メソッドを記述する必要があります。私は、このメソッドを呼び出すことがトリングいパラメータのない汎用メソッドの呼び出し方法

public <T> List list() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    List result = session.createQuery("from " + T.class.getName()).list(); 
    return result; 
} 

: は、この一般的な方法は、休止状態を使用しています。私は以下を試しましたが、コンパイルエラーが発生します:

mgr.list<User>(); 
mgr.list()<User>; 
mgr.list(<User>); 

どうすればこのメソッドを呼び出せますか?

+2

線を行います。 getName())。list(); 'またコンパイルエラーを出しますか? – ggreiner

+0

@ggreiner:はい..あなたはどうやって知っていますか?それは "タイプ変数から選択できません"と伝えます。これは私のIDEのコンパイル機能を休止状態にすることと関連していると思います。どうすればいいですか? – Naor

答えて

4

私はあなたが達成しようとしているものは、いくつかのリファクタリングを必要としていると信じています。任意のModelオブジェクトをクエリするために再利用できる汎用Daoクラスを作成しようとしているようです。問題は、クラスをメソッドに渡すことなく、実行時に<T>ジェネリック型を取得できないことです。

目的を達成するための1つの方法は、コンパイル時に処理しているクラスを認識する特定の実装によって拡張されたベースdaoを作成することです。

public abstract class AbstractDao<T>{ 
    private Class<T> clazz; 
    public AbstractDao(Class<T> clazz){ 
    this.clazz = clazz; 
    } 


    public List<T> list() { 
    Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
    List result = session.createQuery("from " + clazz.getName()).list(); 
    return (List<T>) result; 
    } 
} 

そしてクラスを拡張:

class UserDao extends AbstractDao<User>{ 
    public UserDao(){ 
     super(User.class); 
    } 
} 

そしてメソッドを呼び出す:+ T.class "から" `リスト結果は= session.createQuery(:

List<User> users = userDao.list(); 
+0

ありがとう! – Naor

+0

この実装のプロブラムは、eacエンティティタイプのAbstractDaoのインスタンスを作成する必要があることです。非ジェネリックDAOを作成する方法はありますか?しかし、それは一般的な方法なので、DAOを一度しかインスタンス化できませんか? – Naor

+0

これを行う唯一の方法は、 'list'のメソッドシグネチャを次のように変更することです:' public List list(クラス clazz){' – ggreiner

7

あなたはこれを忘れてしまった:

mgr.<User>list() 
1

それが原因でジェネリックを使用しての、「型消去」とは何かを持っていることがあります。お電話の際には、実行前にTタイプが消去されています。

T.class.getName() 

実行時には使用できません。型の安全性を確認するためにコンパイル時にのみ使用されます。あなたはおそらく実行時にあなたのタイプのPersitenceクラスを取得し、それをmgrクラスで使用するためのコードを書く必要があります。 exmapleは、それが必要な時はいつでもpersistentClassは、クラスであることを、その後、構築時にパラメータの型に設定されているpersistentClassがあり、ここでhttps://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t

から

public abstract class GenericHibernateDAO<T, ID extends Serializable> 
     implements GenericDAO<T, ID> { 

    private Class<T> persistentClass; 
    private Session session; 

    public GenericHibernateDAO() { 
     this.persistentClass = (Class<T>) ((ParameterizedType) getClass() 
           .getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    // more methods 


} 

です。

関連する問題