2011-12-18 20 views
0

次のコードは、SomeClassクラスに具体的に実装されているインターフェイスSomeGenericInterfaceで一般的に宣言された最初の型パラメータクラスを取得します。ジェネリック型引数を取得する適切な方法

このコードは実際に動作します。

質問は次のとおりです。いつもと同じ要素数を持つことが保証

  • getInterfaces()
  • getGenericInterfaces()

:それはつまり、次の2つのクラスメソッドは、どのような場合に動作しますこれらのメソッドによって返されるインタフェースの順序はそれぞれ同じですか?

これを行うにはもっと安全な方法がありますか?

<!-- language: lang-java --> 

Class clazz = SomeClass.class; 

Class classes[] = clazz.getInterfaces(); 
Type types[] = clazz.getGenericInterfaces(); 
ParameterizedType found = null; 

for (int i=0; i<classes.length; i++) { 
    if ( classes[i] == SomeGenericInterface.class) { 
     found = (ParameterizedType) types[i]; 
     break; 
    } 
} 
if (found == null) { 
    return null; 
} 
Class firstType = (Class) found.getActualTypeArguments()[0]; 

答えて

2

両方の方法のためのjavadoc状態:

をこのオブジェクトがクラスを表す場合、戻り値は クラスによって実装されるすべてのインタフェースを表すオブジェクトを含む配列 あります。配列内のインタフェースオブジェクトの順序は、 に対応し、このオブジェクトが表すクラスの 宣言のimplements句のインタフェース名の順番に対応します。

したがって、両方の質問に対する回答は、同じ数の要素と同じ順序です。

+0

これはまさに私が探していたものでした。ありがとう、rsp! – hpgisler

+0

から来てhttp://stackoverflow.com/questions/22250619/classgetinterfaces-and-classgetgenericinterfaces-return-arrays-of-differin私は、この仮定はjavacコンパイルされたコードのためだけに保持する必要があります警告する必要があります。クラスが他のどこから来ていても、ベットがすべてオフの場合 – blackdrag

0

それはありませんではなく、あなたが疑う理由により、いかなる場合

で動作します。クラスが直接インターフェイスを実装する場合(スーパークラスからインターフェイスを継承するのではなく)、型パラメーターの具体的な型を指定します(次の例のように型パラメーターを使用するのではなく)。

class CounterExample<T> implements Interface<T> {} 
+0

はい、ありがとうございました。問題は実際には、クラス[]と型[]に含まれるインタフェースの順序が、具体的な型パラメータを使ってインタフェースを直接実装する具体的なクラス(つまり、あまり明確には述べられていませんでした) 。 rspが指摘したように:はい。 – hpgisler

関連する問題