2013-02-13 53 views
4

java grammar從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的section 15.9中給出的等價語法規則表現出同樣的問題(這些規則引用TypeDecl非終端,在section 4.3中定義)。

回答

2

這條規則看起來像一招,讓雙方在一個規則:

  • new Class1<...>();
  • new Class1.Class2<...>(); // Where Class2 is a static inner class

允許的表達:new Class1<Integer>.Class2<Integer>();絕不會用Java編譯自:

成員類型Class1.Class2不能用一個 參數化類型,因爲它是靜態的。刪除參數 符合條件的類型類別1

+0

爲什麼不將規則表達爲限定符(Class1.Class2),然後是可選的類型參數列表呢?這似乎是顯而易見的事情。 – Norswap 2013-02-13 21:56:01

+0

這個怎麼樣:'標識符[TypeArgumentsOrDiamond] | Identifier.Identifier [TypeArgumentsOrDiamond]'? – 2013-02-14 08:37:34

+0

我真的不明白你的答案:我問過爲什麼Java像它這樣做,而不是像'Identifier(.Identifier)* TypeArgumentsOrDiamond?'。 – Norswap 2013-02-27 08:52:24

1

該語法只是描述了一組超有效的Java源代碼。據我所知,只有最後一個TypeArgumentsOrDiamond可能存在,但你正在看的(簡化)語法不處理這個角落的情況。

相關問題