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>
)。
申し訳ありませんが、私はミスを犯しました。私は 'getParameterTypes'を意味し、' getTypeParameters'を意味しませんでした。違いがあります。私はほとんど気付かなかった。あなたはこの変化を反射する答えを編集できますか? –
@Tiagoは情報を – Thomas
に追加しました。 –