【发布时间】:2014-10-11 10:06:30
【问题描述】:
虽然 JLS 规范中似乎对 Java 语法进行了非常精确的描述,但在某些具体情况下我未能将其应用于给定的定义。
以JLS8第15.9章中的ClassInstanceCreationExpression规则为例,非限定new表达式应为:
new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody]
Identifier 是标准 Java 标识符(基本上是 Java 字母/数字,没有点)。
此定义如何应用于静态嵌套类实例化等有效表达式:
new C1.C2();
或包限定的类实例化:
new java.lang.String("foo");
鉴于点不能成为Identifier 的一部分?
请注意,对于非限定 new 表达式,此定义从 JLS7 更改为 JLS8,其中 JLS7 声明:
new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]
TypeDeclSpecifier 被定义为:
TypeDeclSpecifier:
TypeName
ClassOrInterfaceType . Identifier
允许静态嵌套类和包限定类的非限定 new 表达式。
【问题讨论】: