2016-04-04 7 views
1

私は次のコードセグメント(別の質問への回答)に出くわしましたが、実際には何も分かりません。ParameterizedType.entity行を意味しますか?私はタイプTにクラスを入力していると推測していますが、コードを自分で説明することはできませんでした。一般的なコードセグメントのParameterizedTypeの意味

public class GenericDaoJpaImpl<T, PK extends Serializable> implements GenericDao<T, PK> { 

    protected Class<T> entityClass; 

    @PersistenceContext 
    protected EntityManager entityManager; 

    public GenericDaoJpaImpl() { 
     ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 
     this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0]; 
    } 
+0

http://gafter.blogspot.com/2006/12/super-type-tokens.html – Radiodef

+0

ありがとうございます - 私は見ていきます。 – skyman

答えて

1

getGenericSuperclass

このクラスによって表されるエンティティ(クラス、インタフェース、プリミティブ型、またはvoid)の直接のスーパークラスを表すTypeを返し。 スーパークラスがパラメータ化された型である場合、返されるTypeオブジェクトは、ソースコードで使用される実際の型パラメータを正確に反映する必要があります。スーパークラスを表すパラメータ化された型は、以前に作成されていない場合に作成されます。パラメータ化された型の作成プロセスのセマンティクスについては、ParameterizedTypeの宣言を参照してください。このClassがObjectクラス、インタフェース、プリミティブ型、またはvoidのいずれかを表す場合、nullが返されます。このオブジェクトが配列クラスを表す場合は、Objectクラスを表すClassオブジェクトが返されます。

getGenericSuperclassメソッドは、Typeオブジェクト(この場合はParameterizedType)を返します。 ParameterizedTypeリフレクションパッケージの一部である実際のJavaクラスです。

ParameterizedTypeは、Collectionなどのパラメータ化された型を表します。 このパッケージで指定されているように、リフレクションメソッドによって初めてパラメータ化された型が作成されます。パラメータ化された型pが作成されると、pがインスタンス化するジェネリック型宣言が解決され、pのすべての型引数が再帰的に作成されます。型変数の作成プロセスの詳細については、TypeVariableを参照してください。パラメータ化された型の繰り返し作成は効果がありません。

このインターフェイスを実装するクラスのインスタンスは、同じジェネリック型宣言を共有し、同じ型パラメータを持つ2つのインスタンスを同等にするequals()メソッドを実装する必要があります。

ParameterizedType.getActualTypeArguments

その後の呼び出し:

このタイプの実際の型引数を表すTypeオブジェクトの配列を返します。 場合によっては、返される配列が空であることに注意してください。この型は、パラメータ化されていない型がパラメータ化された型の中に入れ子になっている場合に発生します。

コードを要約すると、GenericDaoJpaImplメソッドは、それ自身のスーパークラスを取得してから、クラスから実際のタイプ情報(この場合は最初の要素のみ)を抽出しています。クラス定義を見ると、ジェネリック型 'T'で宣言されています。したがって、メソッドは、クラスのこのインスタンスに使用されているTの実際のタイプを抽出しています。

+0

包括的な回答ありがとうございます!とても有難い。 – skyman

関連する問題