对于以下代码段:
import java.util.List;
public class Main {
interface Interface1<T> {}
interface Interface2<T> extends Interface1<T> {}
static class Bound {}
interface BoundedI1<T extends Bound> extends Interface1<T> {}
interface BoundedI2<T extends Bound> extends Interface2<T> {}
public static void main(String[] args) {
test((List<BoundedI2<?>>) null);
//test2((List<BoundedI2<?>>) null);
}
public static void test(List<? extends Interface2<? extends Bound>> list) { test2(list); }
public static void test2(List<? extends Interface1<? extends Bound>> list) {}
}
Run Code Online (Sandbox Code Playgroud)
第一次调用时编译器正常,但如果我取消注释第二次调用,则会抱怨.这是类型推理系统中的错误,还是有人可以解释为什么JLS中的推理规则在这里失败?
在6u43和7u45 Oracle JDK上进行了测试.
更新:似乎eclipsec接受它就好了.不幸的是我无法真正改变我们的工具链:P,但在编译器中找到差异很有意思.
错误消息,由ideone打印(很酷的工具顺便说一句):
Main.java:12: error: method test2 in class Main …Run Code Online (Sandbox Code Playgroud)