ParametrizedType - 作为 getActualTypeArguments() 的结果的空数组

ParametrizedType - empty array as result of getActualTypeArguments()

我正在使用反射测试代码,但在我的代码中重现一个 if 语句时遇到问题,可能是因为我没有正确理解该方法的工作原理。

class TestClass {
    public Collection<TestField> field;
}
...
ParameterizedType type = (ParameterizedType) TestClass.class.getField("field").getGenericType();

现在,我正在寻找一个 FieldTypegetActualTypeArguments() 方法将 return 一个 EMPTY Type[]数组。

基于documentation

Note that in some cases, the returned array be empty. This can occur if this type represents a non-parameterized type nested within a parameterized type.

不幸的是,我对这个片段的理解有问题,所以我无法设计一个 class 来实现它。

Section 4.5 of the JLS 对此有一个脚注:

A parameterized type may be an parameterization of a generic class or interface which is nested. For example, if a non-generic class C has a generic member class D<T>, then C.D<Object> is a parameterized type. And if a generic class C<T> has a non-generic member class D, then the member type C<String>.D is a parameterized type, even though the class D is not generic.

所以C<String>.D也是一个ParameterizedType!这就是 getActualTypeArguments 的文档所指的内容。根据文档,getActualTypeArguments 将 return 为 C<String>.D 的空数组。这是一个例子:

class Foo<T> {
    class Bar {

    }
}
public class Main {

    public Foo<Integer>.Bar bar;

    public static void main(String[] args) throws Exception {
        ParameterizedType type = (ParameterizedType) Main.class.getField("bar").getGenericType();

        // this prints 0
        System.out.println(type.getActualTypeArguments().length);
    }

}