Комментарий относится к исходному коду, который доступен по данной ссылке.
Это не ошибка.
Компилятор пытается решить проблему доступа. Так как внутренний
Класс Test.Request является закрытым, его конструктор является закрытым. Это может быть
видел, если вы используете -private для javap:
$ javap -private Test \ $ Запрос, скомпилированный из финального класса "Test.java"
Тест $ Request расширяет java.lang.Object {
окончательный тест это $ 0;
приватный тест $ Request (тест);
Test $ Request (Тест, Тест $ 1); }
Однако JVM не разрешит анонимный подкласс Coucou
(Тест $ 1) доступ к этому приватному конструктору. Это фундаментальный
разница между JVM и языком программирования Java, когда это
доходит до вложенных классов. Язык позволяет вложенным классам получить доступ
частные члены вмещающего класса.
Первоначально, когда вложенные классы были добавлены к языку,
Решением этой проблемы было сделать пакет конструктора приватным
и выглядел бы так:
$ javap -private Test \ $ Запрос, скомпилированный из финального класса "Test.java"
Тест $ Request расширяет java.lang.Object {
окончательный тест это $ 0;
Тест $ Request (Test); }
Однако это может легко привести к проблемам, при которых вы можете получить доступ к
конструктор, когда вы не должны. Для решения этой проблемы
текущее решение было изобретено. «Настоящий» конструктор останется
частное:
private Test$Request(Test);
Однако другие вложенные классы должны иметь возможность вызывать это
конструктор. Таким образом, конструктор доступа должен быть предоставлен. Тем не менее, это
Конструктор доступа должен отличаться от «реального» конструктора. к
решить эту проблему компилятор добавляет дополнительный доступ к доступу
конструктор. Тип этого дополнительного параметра должен быть чем-то
уникальный, не конфликтующий ни с чем, что может иметь пользователь
написано. Таким образом, очевидным решением является добавление анонимного класса и использование
что как тип второго параметра:
Test$Request(Test, Test$1);
Однако, компилятор умный и использует любой анонимный класс, если он
существует. Если вы измените пример, чтобы не включать анонимный класс,
вы увидите, что компилятор создаст один:
публичный абстрактный класс Test {
закрытый финал Класс Запрос {}
закрытый финальный класс OtherRequest {Request test () {return new Request (); }
}}
Если нет доступа к приватному конструктору, компилятор не
необходимо сгенерировать любой конструктор доступа, который объясняет поведение
этот пример:
публичный абстрактный класс Test {
закрытый выпускной запрос {}}