Почему включающий класс не включен в общие параметры для конструкторов внутреннего класса? - PullRequest
3 голосов
/ 19 января 2011
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. Неявный параметр для включающего класса отсутствует.

Кажется, это происходит только тогда, когда внутренний конструктор класса объявляет переменную типа. Почему это так? Это ошибка?

1 Ответ

6 голосов
/ 19 января 2011

Сообщается об ошибке: http://bugs.sun.com/view_bug.do?bug_id=5087240

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...