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のセクション 15.9に記載されている同等の文法規則は、同じ問題を示しています (これらの規則は、セクション 4.3TypeDecl
で定義されている非終端記号を参照しています)。