我正在努力学习getGenericParameterTypes和getParameterTypes方法之间的区别.我知道一个人回来Class[]了,另一个人Type[].但真正的区别是什么呢?
考虑方法:
public void method1(T arg1)
public void method2(String arg2)
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
因为foo你无法T在运行时获得类型(你不知道它Baz),也不能在编译时获得.对于bar你能够得到的类型T,因为它是在编译时已经知道.
查看代码时的另一个区别:
调用getGenericParameterTypes()方法1应该返回T类型,调用方法2应该返回Class<String>.但是,如果你打电话给getTypeParameters()你,你会得到T方法1 的类型,但是方法2的零长度数组.
编辑:因为getParameterTypes()这意味着代替getTypeParameters()我在代码中可以看到的区别:
对于方法2,没有区别,因为如果签名中没有使用泛型,则getGenericParameterTypes()实际调用getParameterTypes().对于方法1,getGenericParameterTypes()将返回一个ParameterizedType声明参数具有名称,T而getParameterTypes()返回所需类型的基类,例如Class<Object>for <T>或Class<Number>for <T extends Number>.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
with GPT: T
with PT: class java.lang.Object
Run Code Online (Sandbox Code Playgroud)