java - Java 规范中的方法类型推断

标签 java compiler-construction type-inference specifications

我目前正在编写 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) = G,

CandidateInvocation( G ) 的结果 = lci( { List } ) 将被定义为:

列表

在我看来,lcta 应该在这里简单地返回 String,因为如果 List 是唯一可能的调用,那么将 List 推断为参数是个好主意。然而,lcta(U) 的定义表明结果是 ?要么 ? extends lub(...),所以结果总是一个通配符。这似乎很奇怪。我在这里误解了什么?

最佳答案

这看起来像是规范的错误。 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/

相关文章:

java - 我无法使用 Java Spring Boot 和 Angular 7 在远程服务器(Apache2)上上传文件。它在本地主机上运行良好

scala - 为什么不允许在方法内部重载方法(例如重载闭包)?

haskell - Haskell 中类型的推理

java - 依赖类型推断如何影响代码的可维护性?

Java6、Guava、泛型、类型推断

java - 获取Decorator对象的所有类型 : type of wrapped objects and the type of wrapper object

java - quickfix.InvalidMessage 即使有有效消息也会抛出异常

java - 如何从 api url 获取本地货币代码?

c# - 预编译的 ASP.NET 网站上的高波动 '% Time in JIT'

java - 为什么 matcher.group 给我一个错误?