Обратите внимание, что с тех пор формулировка в JLS этого конкретного раздела значительно изменилась. Теперь (JLS 11) он гласит:
15.9.5. Объявления анонимных классов:
Анонимный класс никогда не является окончательным (§8.1.1.2).
Тот факт, что анонимный класс не является окончательным, имеет значение при приведении, в частности при преобразовании сужающей ссылки, разрешенном для оператора приведения (§5.5). Это также представляет интерес для создания подклассов, поскольку невозможно объявить подкласс анонимного класса, несмотря на то, что анонимный класс не является окончательным, потому что анонимный класс не может быть назван с помощью предложения extends (§8.1.4).
Это изменение формулировки было введено в JLS 9. Семантика анонимных классов и поведение методов в вопросе остались в основном без изменений, цель состояла в том, чтобы избежать путаницы, о которой идет речь в этом вопросе.
В заявке, вызвавшей изменение, говорится:
Давнее поведение javac, начиная с версии 1.3, по большей части заключалось в том, что не рассматривал классы как "окончательные". Чтобы устранить это несоответствие, необходимо изменить спецификацию, чтобы она точно отражала эталонную реализацию.
В частности, анонимные классы почти никогда не создаются с установленным флагом ACC_FINAL. Мы не можем изменить это давнее поведение, не повлияв на некоторых клиентов сериализации (это допустимо, но излишне разрушительно). И мы не можем точно реализовать Class.getModifers (который обещает предоставить модификаторы языка Java) без файлов классов, кодирующих модификаторы языка.
Однако изменение действительно фактически в некоторой степени изменило семантику, и это также было задокументировано в этой заявке как допустимое влияние:
Это изменение влияет на набор легальных программ, поскольку позволяет выполнять некоторые приведения типов, которые в текущей спецификации считаются незаконными (см. JDK-6219964). Но после поиска упоминаний о «финальных» классах в JLS я не ожидаю никакого другого воздействия, а это означает, что это исправление, совместимое с исходным кодом.
person
Hulk
schedule
03.01.2019