编程语言
首页 > 编程语言> > 在java语法中具有多个类型参数列表的构造方法

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

作者:互联网

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中定义).

解决方法:

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

> new Class1< ...>();
> new Class1.Class2< ...>(); //其中Class2是静态内部类

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

The member type Class1.Class2 cannot be qualified with a
parameterized type, since it is static. Remove arguments from
qualifying type Class1

标签:java,specifications,grammar,jls
来源: https://codeday.me/bug/20190629/1328922.html