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
и Object
(стирание T
).
Однако, поскольку конструктор является общим, вызов getGenericParameterTypes
вместо этого возвращает массив, содержащий только переменную типа T
. Неявный параметр для включающего класса отсутствует.
Кажется, это происходит только тогда, когда внутренний конструктор класса объявляет переменную типа. Почему это так? Это ошибка?