грамматика Java из спецификации языка Java v7 определяет следующие правила грамматики для конструкторов:
Primary:
...
new Creator
...
Creator:
NonWildcardTypeArguments CreatedName ClassCreatorRest
CreatedName ( ClassCreatorRest | ArrayCreatorRest )
CreatedName:
Identifier [TypeArgumentsOrDiamond] { . Identifier [TypeArgumentsOrDiamond] }
ClassCreatorRest:
Arguments [ClassBody]
Что меня озадачивает, так это правило CreatedName
. По этому признаку такие выражения, как
new Class1<Integer>.Class2<Integer>();
были бы действительными конструкторами. Которыми они, конечно, не являются.
На самом деле, я не могу найти ни одного случая, когда цепочка идентификаторов (например, Class1.Class2
) имела бы более одного списка параметров типа (например, <Integer>
). Существуют ли такие случаи, или грамматика не имеет смысла?
Для справки эквивалентные грамматические правила приведены в раздел 15.9 JLS демонстрирует ту же проблему (эти правила ссылаются на нетерминал TypeDecl
, который определен в раздел 4.3).