我正在尝试了解getGenericParameterTypes
和getParameterTypes
方法之间的区别。我知道其中一个返回Class[]
而另一个Type[]
。但真正的区别是什么?
考虑方法:
public void method1(T arg1)
public void method2(String arg2)
在每个示例方法上调用每个get
方法时会得到什么?
答案 0 :(得分:7)
我无法准确地告诉你你会得到什么,但一个区别是,对于方法2,你可以告诉参数类型是Class<String>
而对于方法1,你只知道有一个名为{{的参数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
的类型(您不知道它是T
),也不能在编译时获取。对于Baz
,您可以获得bar
的类型,因为它在编译时已经知道。
查看代码时的另一个不同之处:
在方法1上调用T
应该返回getGenericParameterTypes()
类型,为方法2调用它应该返回T
。但是,如果您致电Class<String>
,您将获得方法1的getTypeParameters()
类型,但方法2的零长度数组。
编辑:由于T
代表getParameterTypes()
而不是getTypeParameters()
,我可以从代码中看到差异:
对于方法2,没有区别,因为如果签名中没有使用泛型,getGenericParameterTypes()
实际上会调用getParameterTypes()
。对于方法1,getGenericParameterTypes()
将返回ParameterizedType
,表示参数名称为T
,而getParameterTypes()
将返回该类型所需的基类,例如Class<Object>
为<T>
,Class<Number>
为<T extends Number>
。
答案 1 :(得分:5)
getGenericParameterTypes
可以返回其他类型的Type
。 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