Java 语言规范 v7 中的java 语法为构造函数指定了以下语法规则:
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>
)。这种情况是否存在,或者语法没有意义?
作为参考, JLS第 15.9 节中给出的等效语法规则也存在同样的问题(这些规则引用了第 4.3 节TypeDecl
中定义的非终结符)。