В разделе 8.1.1 Модификаторы классов спецификации языка Java 8 говорится, что:
ClassModifier: один из
Аннотация аннотация public protected private abstract static final strictfp
Но мне удалось скомпилировать следующее:
public strictfp A{}
То есть, он указывает, что один из модификаторов класса должен быть выбран, но я смог выбрать более одного. Я неверно истолковал здесь спецификацию?
Ответ приведен в правиле выше:
ClassModifiers:
ClassModifier
ClassModifiers ClassModifier <<== Here
ClassModifier: one of
Annotation public protected private abstract static final strictfp
По сути, в правиле говорится, что вы можете использовать один или несколько ClassModifier
в списке ClassModifiers
. Это рекурсивное определение итеративной концепции "один или несколько" является общим для описания синтаксиса стиля BNF (в отличие от EBNF, которые обеспечивают специальный синтаксис повторений).
{
<что-то> }
означает «Ноль или более повторений <что-то>». Это стиль EBNF. Квадратные скобки [
<что-то> ]
означают «необязательный <что-то>». Странно, что они смешивают два стиля.
Спецификация языка Java ClassModifiers точно определяет:
ClassModifiers:
ClassModifier
ClassModifiers ClassModifier
ClassModifier: one of
Annotation public protected private
abstract static final strictfp
Таким образом, это либо 1, либо более ClassModifier перед классом