2011-07-19 54 views
7

getGenericParameterTypesgetParameterTypesメソッドの違いを知りたいと思います。私はClass[]ともう1つはType[]です。しかし、本当の違いは何ですか?getGenericParameterTypesとgetParameterTypesの相違点

考慮方法:

public void method1(T arg1) 
public void method2(String arg2) 

例の方法のそれぞれの上にgetの各メソッドを呼び出すときに、私は何を得るのでしょうか?

答えて

6

2つの方法の違いは、方法2の場合はClass<String>と、1の場合はTというパラメーターがありますが、 Tが宣言されているクラス以外の正確な型は、Tの具象クラスでサブクラス化されています。

例:fooについては

class Foo<T> { 
    public void method1(T arg1) { ... } 
} 

class Bar extends Foo<Baz> { ... } 

Foo<?> foo = new Foo<Baz>(); 
Bar bar = new Bar(); 

実行時にTの種類を取得することができる(あなたはそれがBazだか分からないと思います)もコンパイル時ではないと思います。 barの場合、コンパイル時にすでに知っているので、Tの型を取得できます。

コードを見てもう一つの違い:

Class<String>を返すべき方法2のためにそれを呼び出して、T型を返す必要があります方法1にgetGenericParameterTypes()を呼び出します。あなたはgetTypeParameters()呼び出す場合しかし、あなたは方法1のためTタイプが、メソッドのための長さゼロの配列を取得したい2.

編集:getParameterTypes()ではなくgetTypeParameters()のものだったので、ここで私はコードから見ることができる違いがあります:

方法2の場合、署名にジェネリックスが使用されていない場合、getGenericParameterTypes()は実際にgetParameterTypes()を呼び出しますので、違いはありません。方法1の場合、getGenericParameterTypes()は、ParameterizedTypeを返します。このパラメータには、Tという名前がありますが、getParameterTypes()は、タイプの必須の基本クラスを返します。 (<T>)またはClass<Number><T extends Number>)。

+0

申し訳ありませんが、私はミスを犯しました。私は 'getParameterTypes'を意味し、' getTypeParameters'を意味しませんでした。違いがあります。私はほとんど気付かなかった。あなたはこの変化を反射する答えを編集できますか? –

+0

@Tiagoは情報を – Thomas

+0

に追加しました。 –

5

getGenericParameterTypesは、他の種類のTypeを返すことができます。 getParameterTypeは「ジェネリックになる前の」反射です。つまり、Tjava.lang.Objectとみなされます。この例をチェックしてください:

public class Generics<T> { 

    public void method1(T t) { 
    } 

    public static void main(String[] args) throws Exception { 
     Method m = Generics.class.getMethod("method1", Object.class); 
     for (Type t : m.getGenericParameterTypes()) { 
      System.out.println("with GPT: " + t); 
     } 
     for (Type t : m.getParameterTypes()) { 
      System.out.println("with PT: " + t); 
     } 
    } 

} 

出力は次のとおりです。

with GPT: T 
with PT: class java.lang.Object