我目前正在编写 Java 编译器并已实现第 15.12.2.7 节。 JLS7 ( http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7 ) 的一部分,规范中最烦人的部分之一。我仍然有一个问题,因为规范似乎不明确或模棱两可。我的问题是这一行:
lcta(U) = ?如果 U 的上限是 Object,否则 ?扩展 lub(U,Object)
U 是一个任意类型的表达式。类型表达式的上限是多少?另外,为什么 lcta 总是通配符?
规范定义
CandidateInvocation(G) = lci(Inv(G))。
现在,例如,考虑 Inv(G) = { List
lci(G
CandidateInvocation( G ) 的结果 =
lci( { List
列表
在我看来,lcta 应该在这里简单地返回 String,因为如果 List
最佳答案
这看起来像是规范的错误。 lcta(U)
的条款JSL3 中不存在。显然 JLS3 对 lci(e1..en)
的定义n=1
时不完整,新规范试图修复它。但是正如您所推理的那样,修复程序似乎是胡言乱语。
Javac7计算lci( { List<String> } )
作为List<String>
, 忽略添加的子句。
应该向规范维护者提出这个问题;不确定如何联系他们。您可以尝试 openjdk compiler-dev 邮件列表;上面有一些知识渊博的人。
关于java - Java 规范中的方法类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10691035/