2010-12-19 10 views
0

申し訳ありませんがタイル...私は私の質問を再開する方法を知らなかった。一般性に一般性を導入することは可能ですか?

は私が私の問題を紹介しましょう:

私はジェネリック型の型を取得したいです。

いくつかのコード:

public class AbstractDao<T, PK extends Serializable> { 
    public T getByPrimaryKey(PK primariKey) { 
    return null; 
    } 
} 

public class AbstractEntity<PK extends Serializable> { 
    PK id; 
    //Getter Setter 
} 

public class Entity extends AbstractEntity<Long> { 
} 

私は変更したいコード:

public class AbstractService<T, PK extends Serializable> { 
    AbstractDao<T, PK> dao; 

    public T getByPrimaryKey(final PK primaryKey) { 
     return dao.getByPrimaryKey(primaryKey); 
    } 
} 

public class EntityService extends AbstractService<Entity, Long> {} 

アイデアはAbstractService から "PKはSerializableを拡張し、" 削除してdynamiclyそれを得るためです。

どうすればいいですか?助けのための

public T getByPrimaryKey(final PK primaryKey) 

感謝を: - > PKは、私はこの方法では、「オブジェクト」の代わりに「PK」を使用したくない...滞在する必要があります。

種類は、あなたが避けることができそうすればあなたはジェネリックPKタイプしたくない場合は、あなたがそのようなLongPrimaryKeyなど様々な実装、などと実際の主キーのラッパーとしてPrimaryKeyインターフェースを作成することができます

+0

"アイデアは、" PK extends Serializable "をAbstractServiceから削除し、動的に取得することです。" 「動的に」という意味はどういう意味ですか?あなたはそれで何をしたいですか? –

+0

どこから動的に取得するには?あなたの現在のコードについて気に入らないのは何ですか? –

答えて

0

についてジェネリック型

しかし、実際の型自体(Longなど)を渡すことができるようにするには、ジェネリック型の周りに道が見えません。

0

AbstractDaoの具体的なインスタンスを作成すると、javaはジェネリック型を判別できます。

(Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

はあなたの最初のジェネリックPARAMTERのランタイム型を与えるだろう。これは常に利用できるとは限りませんので、ドキュメントとに確認してください。

関連する問題