在java语法中具有多个类型参数列表的构造方法

时间:2013-02-13 12:04:35

标签: java grammar specifications jls

Java语言规范v7中的java grammar为构造函数指定了以下语法规则:

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 个答案:

答案 0 :(得分:2)

这条规则看起来像是一个允许在一个规则中使用的技巧:

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

允许的表达式:new Class1<Integer>.Class2<Integer>();永远不会在Java中编译,因为:

  

成员类型Class1.Class2不能用a限定   参数化类型,因为它是静态的。从中删除参数   限定类型Class1

答案 1 :(得分:1)

语法只描述了一组有效的Java源代码。据我所知,只有最后一个TypeArgumentsOrDiamond可能存在,但你所看到的(简化)语法并不涉及这个极端情况。