Обратите внимание, что формулировка в 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») без файлов классов, кодирующих модификаторы языка.