4

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.3 节TypeDecl中定义的非终结符)。

4

2 回答 2

2

此规则看起来像是在单个规则中允许两者的技巧:

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

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

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

于 2013-02-13T12:26:41.083 回答
1

该语法只是描述了一组有效的 Java 源代码。据我所知,只有最后一个TypeArgumentsOrDiamond可能存在,但您正在查看的(简化)语法不处理这种极端情况。

于 2013-02-13T12:25:24.720 回答