import java.lang.reflect.*;
import java.util.Arrays;
class Test {
class Inner {
public <T> Inner(T arg) {}
}
public static void main(String[] args) {
Constructor<?> constructor = Test.Inner.class.getConstructors( )[0];
System.out.println(
"Regular parameters: " +
Arrays.toString(constructor.getParameterTypes()) +
"\nGeneric parameters: " +
Arrays.toString(constructor.getGenericParameterTypes())
);
}
}
运行此命令会打印以下内容。
常规参数:[类Test,类java.lang.Object]
通用参数:[T]
我对Java内部类(即非静态)的理解是它们的构造函数隐式地为它们的封闭类提供了一个参数。因此,要获取Inner
的实例,可以像这样调用它的构造函数。
Test.Inner foo = new Test().new Inner(new Object());
实际发生的是Test
的实例被传递给Inner
的构造函数(以及任何其他参数),并将其分配给隐式实例字段。
检查Inner
的无效构造函数可以解决这个问题,因为调用getParameterTypes
会返回一个数组,其中包含代表Class
和Test
的{{1}}个对象(擦除) Object
)。
但是,由于构造函数是通用的,因此调用T
会返回仅包含类型变量getGenericParameterTypes
的数组。缺少封闭类的隐式参数。
当内部类构造函数声明一个类型变量时,似乎只会发生这种情况。为什么这样做?这是一个错误吗?