假设我有以下代码:
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
如何解决这个问题:
答案 0 :(得分:11)
这实际上是一个错误修正(参见JDK-8013357):Java-7行为与JLS §15.21相矛盾:
可以使用相等运算符将两个可转换的操作数(第5.1.8节)与数值类型或两个类型为
boolean
或Boolean
的操作数进行比较,或两个操作数分别对应引用类型或null
类型。所有其他情况都会导致编译时错误。
在你的情况下,一个操作数是数字类型,而另一个是引用类型(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();
}
答案 1 :(得分:2)
如果你想比较Number和int - 调用Number.intValue()然后比较。