ParametrizedType - 作为 getActualTypeArguments() 的结果的空数组
ParametrizedType - empty array as result of getActualTypeArguments()
我正在使用反射测试代码,但在我的代码中重现一个 if
语句时遇到问题,可能是因为我没有正确理解该方法的工作原理。
class TestClass {
public Collection<TestField> field;
}
...
ParameterizedType type = (ParameterizedType) TestClass.class.getField("field").getGenericType();
现在,我正在寻找一个 FieldType
,getActualTypeArguments()
方法将 return 一个 EMPTY Type[]
数组。
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);
}
}
我正在使用反射测试代码,但在我的代码中重现一个 if
语句时遇到问题,可能是因为我没有正确理解该方法的工作原理。
class TestClass {
public Collection<TestField> field;
}
...
ParameterizedType type = (ParameterizedType) TestClass.class.getField("field").getGenericType();
现在,我正在寻找一个 FieldType
,getActualTypeArguments()
方法将 return 一个 EMPTY Type[]
数组。
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 classD<T>
, thenC.D<Object>
is a parameterized type. And if a generic classC<T>
has a non-generic member classD
, then the member typeC<String>.D
is a parameterized type, even though the classD
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);
}
}