我目前正在编写一个Java编译器,并实现了JLS7规范的第15.12.2.7节(http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7),这是规范中最烦人的部分之一。然而,我仍然有一个问题,因为规范似乎有点不够明确或模棱两可。我的问题是以下这行代码:
lcta(U) = ? if U's upper bound is Object, otherwise ? extends lub(U,Object)
U是任意类型表达式。类型表达式的上限是什么?此外,为什么lcta总是通配符?
规范定义了
CandidateInvocation(G) = lci(Inv(G))。
例如,考虑Inv(G) = { List<String> }的情况,即唯一可能的候选调用是单个参数化类型。由于规则的缘故,
U是任意类型表达式。类型表达式的上限是什么?此外,为什么lcta总是通配符?
规范定义了
CandidateInvocation(G) = lci(Inv(G))。
例如,考虑Inv(G) = { List<String> }的情况,即唯一可能的候选调用是单个参数化类型。由于规则的缘故,
lci(G<X1, ..., Xn>) = G<lcta(X1), ..., lcta(Xn)>
候选调用的结果为CandidateInvocation(G) = lci({List<String>}),其定义如下:
List<lcta(String)>
在我看来,lcta应该只返回字符串String,因为如果List<String>是唯一可能的调用方式,那么推断List<String>作为参数是一个好主意。然而,lcta(U)的定义规定结果要么是?,要么是? extends lub(...),因此结果始终是通配符。这似乎很奇怪。我在这里误解了什么吗?