不可比较的类型:Java8中的int和Number

不可比较的类型:Java8中的int和Number,java,compilation,java-8,openjdk,Java,Compilation,Java 8,Openjdk,假设我有以下代码: class proba { boolean fun(Number n) { return n == null || 0 == n; } } 使用openjdk 7(debian wheezy)编译时没有问题,但使用openjdk 8时编译失败,出现以下错误(即使使用-source 7): 如何解决这个问题: 这个构造是否有编译器选项可以继续在Java8中工作 我是否应该用instanceof检查所有Number的子类和casting,然后逐

假设我有以下代码:

class proba {
    boolean fun(Number n) {
        return n == null || 0 == n;
    }
}
使用openjdk 7(debian wheezy)编译时没有问题,但使用openjdk 8时编译失败,出现以下错误(即使使用-source 7):

如何解决这个问题:

  • 这个构造是否有编译器选项可以继续在Java8中工作
  • 我是否应该用instanceof检查所有Number的子类和casting,然后逐个进行比较,来进行大量连续的if?这看起来很难看
  • 其他建议
这实际上是一个错误修复(请参阅):Java-7行为与:

相等运算符可用于比较两个可转换为数值类型(§5.1.8)的操作数,或两个
布尔
布尔
类型的操作数,或两个参考类型或
类型的操作数。所有其他情况都会导致编译时错误

在您的情况下,一个操作数是数字类型,而另一个是引用类型(
Number
不能转换为数字类型),因此根据规范,它应该是编译时错误

(搜索“原语”)中提到了此更改

请注意,虽然您的代码是用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();
}

如果您想比较Number和int,请调用Number.intValue()然后进行比较。

谢谢,n.intValue()就是我要找的!
boolean fun(Number n) {
    return n == null || 0 == n.doubleValue();
}