无与伦比的类型:java和java中的Number

时间:2016-01-18 15:12:24

标签: java compilation java-8 openjdk

假设我有以下代码:

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

如何解决这个问题:

  • 此构造是否有编译器选项继续在java 8中工作?
  • 我应该使用instanceof检查所有Number的子类并进行逐行比较,然后逐个进行比较吗?这看起来很难看......
  • 其他建议?

2 个答案:

答案 0 :(得分:11)

这实际上是一个错误修正(参见JDK-8013357):Java-7行为与JLS §15.21相矛盾:

  

可以使用相等运算符将两个可转换的操作数(第5.1.8节)与数值类型或两个类型为booleanBoolean的操作数进行比较,或两个操作数分别对应引用类型或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()然后比较。