我试图学习getGenericParameterTypes
和getParameterTypes
方法之间的区别。我知道一个返回Class[]
,另一个返回Type[]
。但它们真正的区别是什么?
public void method1(T arg1)
public void method2(String arg2)
在每个示例方法上调用每个get
方法时会得到什么?
我不能确切地告诉你你会得到什么,但一个区别是,对于方法2,你可以告诉参数类型是Class<String>
,而对于方法1,你只知道有一个名为T
的参数,但你不知道确切的类型,除了T
被声明的类将被子类化为T
的具体类。
的例子:
class Foo<T> {
public void method1( T arg1 ) { ... }
}
class Bar extends Foo<Baz> { ... }
Foo<?> foo = new Foo<Baz>();
Bar bar = new Bar();
对于foo
,您无法在运行时(您不知道它是Baz
)或编译时获得T
的类型。对于bar
,您可以获得T
的类型,因为它在编译时已经知道了。
查看代码时的另一个区别:
在方法1上调用getGenericParameterTypes()
应该返回T
类型,在方法2上调用它应该返回Class<String>
类型。但是,如果调用getTypeParameters()
,方法1得到的是T
类型,方法2得到的是零长度数组。
编辑:因为getParameterTypes()
是指而不是getTypeParameters()
,这是我从代码中看到的差异:
对于方法2没有区别,因为如果签名中没有使用泛型,getGenericParameterTypes()
实际上调用getParameterTypes()
。对于方法1,getGenericParameterTypes()
将返回一个ParameterizedType
,说明参数名称为T
,而getParameterTypes()
将返回该类型所需的基类,例如,<T>
的Class<Object>
或<T extends Number>
的Class<Number>
。
getGenericParameterTypes
可以返回其他类型的Type
s。getParameterType
是"前泛型"反射。这意味着T
将被视为java.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