假设我有以下代码:
class proba {
boolean fun(Number n) {
return n == null || 0 == n;
}
}
使用 openjdk 7 (debian wheezy) 编译没有问题,但在使用 openjdk 8 时编译失败,出现以下错误(即使使用 -source 7):
proba.java:3: error: incomparable types: int and Number
return n == null || 0 == n;
^
1 error
如何解决这个问题:
最佳答案
这实际上是一个错误修正(参见 JDK-8013357 ):Java-7 行为与 JLS §15.21 相矛盾:
在您的情况下,一个操作数是数字类型,而另一个是引用类型( Number
不可转换为数字类型),因此根据规范,它应该是编译时错误。
Compatibility Guide for Java 8(搜索“原始”)中提到了这一变化。
请注意,虽然您的代码在 Java-7 中编译,但它的工作方式有些奇怪:
System.out.println(new proba().fun(0)); // compiles, prints true
System.out.println(new proba().fun(0.0)); // compiles, prints false
System.out.println(new proba().fun(new Integer(0))); // compiles, prints false
这就是为什么 Java-7 将 0 提升为
Integer
对象(通过自动装箱),然后通过引用比较两个对象,这不太可能是您想要的。要修复您的代码,您可以将
Number
转换为一些预定义的原始类型,如 double
:boolean fun(Number n) {
return n == null || 0 == n.doubleValue();
}