Java语言规范v7中的java grammar为构造函数指定了以下语法规则:
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的section 15.9中给出的等效语法规则表现出相同的问题(这些规则引用TypeDecl
非终端,其在section 4.3中定义。
答案 0 :(得分:2)
这条规则看起来像是一个允许在一个规则中使用的技巧:
new Class1<...>();
new Class1.Class2<...>(); // Where Class2 is a static inner class
允许的表达式:new Class1<Integer>.Class2<Integer>();
永远不会在Java中编译,因为:
成员类型Class1.Class2不能用a限定 参数化类型,因为它是静态的。从中删除参数 限定类型Class1
答案 1 :(得分:1)
语法只描述了一组有效的Java源代码。据我所知,只有最后一个TypeArgumentsOrDiamond
可能存在,但你所看到的(简化)语法并不涉及这个极端情况。