getGenericParameterTypes与getParameterTypes的区别



我试图学习getGenericParameterTypesgetParameterTypes方法之间的区别。我知道一个返回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

相关内容

  • 没有找到相关文章

最新更新