在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