Java语法定义完整性

时间:2014-10-11 10:06:31

标签: java grammar jls

尽管JLS规范中似乎已经非常精确地描述了Java语法,但是有一些具体案例我无法应用于给定的定义。

例如,在JLS8的第15.9章中采用ClassInstanceCreationExpression规则,非限定new表达式应采用以下形式:

new [TypeArguments] {Annotation} Identifier [TypeArgumentsOrDiamond] ( [ArgumentList] ) [ClassBody] 

Identifier是标准的Java标识符(基本上是Java字母/数字,没有点)。

此定义如何应用于有效表达式,如静态嵌套类instanciation:

new C1.C2();

或包限定类instanciation:

new java.lang.String("foo");

鉴于点不能成为Identifier的一部分?

请注意,对于非限定new表达式,此定义从JLS7更改为JLS8,其中JLS7表示:

new [TypeArguments] TypeDeclSpecifier [TypeArgumentsOrDiamond]( [ArgumentList] ) [ClassBody]

TypeDeclSpecifier被定义为:

TypeDeclSpecifier:
    TypeName
    ClassOrInterfaceType . Identifier 

允许静态嵌套类和包限定类的非限定new表达式。

1 个答案:

答案 0 :(得分:5)

规范中似乎是bug

引自上面链接的错误报告(说明中的第三点):

  
      
  1. 语法没有为以下表达式定义任何产品:new java.security.Permissions()
  2.         

    这是在4.3中删除TypeDeclSpecifier的副作用,因为它与类型注释的交互很差。 JSR 308 Public Review指出:" TypeDeclSpecifier是Java语言规范中比较模糊的非终结符之一。它仅在少数几种情况下使用:类声明的扩展和实现子句(8.1.4,8.1.5),接口声明的扩展子句(9.1.3),以及类实例创建的语法表达式(15.9)。使用它的原因是禁止使用通配符类型的参数(尽管9.1.3实际上没有这样做),但是如果没有专用的非终端,这可以同样很好地实现。"