2016-01-18 32 views
4

假設我有以下代碼:無可比擬類型:int和數量在Java 8

class proba { 
    boolean fun(Number n) { 
     return n == null || 0 == n; 
    } 
} 

此編譯沒有使用的openjdk 7(的debian喘鳴)的問題,但未能使用的openjdk 8時,用下面的編譯

proba.java:3: error: incomparable types: int and Number 
    return n == null || 0 == n; 
         ^
1 error 

如何去解決這個:

  • 是否有THI編譯器選項錯誤(當使用-source 7連) s構造繼續在java 8中工作?
  • 我是否應該使用instanceof檢查所有Number的子類並進行轉換,然後逐個比較來製作大量連續ifs?這似乎很難...
  • 其他建議?

回答

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(); 
} 
+0

謝謝,n.intValue()是我一直在尋找! –

2

如果要比較數和int - 調用Number.intValue(),然後進行比較。