我目前正在编写 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 总是通配符?
规范定义
候选调用(G)= lci(Inv(G))。
现在,例如,考虑 Inv(G) = { List<String> } 的情况,即唯一可能的候选调用是单个参数化类型。现在,由于规则
lci(G<X1, ..., Xn>) = G<lcta(X1), ..., lcta(Xn)> ,
CandidateInvocation( G ) = lci( { List<String> } ) 的结果将被定义为:
列表<lcta(String)>
在我看来,lcta 应该在这里简单地返回 String,因为如果 List<String> 是唯一可能的调用,那么推断 List<String> 作为参数是个好主意。但是,lcta(U) 的定义表明结果是 ? 或者 ?扩展 lub(...),所以结果总是一个通配符。这似乎很奇怪。我在这里误解了什么?