2014-10-11 25 views
5

儘管Java的語法似乎是在JLS規格非常精確的描述,也有一些我無法應用上給出的定義具體案例。Java的語法定義完整性

例如,以一章中的ClassInstanceCreationExpression規則JLS8,非合格new表達式15.9應該是這樣的形式:

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

Identifier是標準Java標識符(基本上爪哇字母/數字,點)。

請問這個定義也適用於有效的表達像靜態內部類instanciation:

new C1.C2(); 

或全限定類instanciation:

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

因爲點不能是一個Identifier的一部分嗎?

注意,有這個定義從JLS7到JLS8,其中JLS7被指出,對於非合格new表情的變化:

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

TypeDeclSpecifier被定義爲:

TypeDeclSpecifier: 
    TypeName 
    ClassOrInterfaceType . Identifier 

允許非合格new表達式靜態嵌套類和包限定類。

回答

5

這似乎是在規範bug

從連接到上述(在描述第三點)的錯誤報告引用:

  • 語法沒有定義任何生產爲以下表達式:新的Java .security.Permissions()
  • 這是在4.3中刪除TypeDeclSpecifier的一個副作用,因爲它與類型註釋交互較差。該JSR 308公共評論指出:「TypeDeclSpecifier是在Java語言規範比較模糊的終結符號之一,它只用在情況屈指可數:在延伸,並實現了類聲明(8.1.4,8.1.5條款),在擴展接口聲明(9.1.3),和一個類實例創建表達式(15.9)的語法的條款,其原因它的使用是禁止通配符類型的參數(儘管實際上9.1.3未能做到) ,但是如果沒有專用的非終端,這一點也可以實現。「