【问题标题】:Constructor with multiple type arguments list in java grammarjava语法中具有多个类型参数列表的构造函数
【发布时间】:2013-02-13 12:04:35
【问题描述】:

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)会有多个类型参数列表(例如&lt;Integer&gt;)。这种情况是否存在,还是语法没有意义?

作为参考,JLS 的section 15.9 中给出的等效语法规则存在相同的问题(这些规则引用了TypeDecl 非终结符,它在section 4.3 中定义)。

【问题讨论】:

    标签: java grammar specifications jls


    【解决方案1】:

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

    • new Class1&lt;...&gt;();
    • new Class1.Class2&lt;...&gt;(); // Where Class2 is a static inner class

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

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

    【讨论】:

    • 为什么不将规则表示为限定标识符(Class1.Class2),然后是可选类型参数列表呢?这似乎是显而易见的事情。
    • 这个怎么样:Identifier [TypeArgumentsOrDiamond] | Identifier.Identifier[TypeArgumentsOrDiamond]
    • 我不太明白你的回答:我问为什么 Java 会像现在这样而不是像 Identifier (.Identifier)* TypeArgumentsOrDiamond? 那样做。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2023-01-01
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多