编译器使用泛型方法的 null 参数时行为不同
下面的代码使用 Eclipse 完美编译,但无法使用 javac 进行编译:
public class HowBizarre {
public static <P extends Number, T extends P> void doIt(P value) {
}
public static void main(String[] args) {
doIt(null);
}
}
我简化了代码,所以现在根本不使用T。不过,我没有看到错误的原因。出于某种原因,javac 决定 T 代表 Object,然后抱怨 Object 不符合 T 的边界(这是真的):
HowBizarre.java:6:不兼容的类型;推断类型参数 java.lang.Number,java.lang.Object 不符合类型变量 (s) P,T 的边界
已找到 : 无效
<P,T>
必需:无效
doIt(null); ^
请注意,如果我将 null 参数替换为非 null 值,则编译正常。
哪些编译器行为正确,为什么?这是其中之一的错误吗?