2011-07-30 51 views
2

下面是一個相當標準件的Java代碼已被翻譯成斯卡拉爲什麼在將以下內容從Java轉換爲Scala時,會出現「總會產生錯誤」警告?

val result: ResultSet = statement.executeQuery(query) 

    while (result.next) { 
    if (result.getDouble("FIELD") != null) { 

    } 
} 

爲什麼我得到

警告:使用`比較類型的雙和空值=」將 !總是屈服於真實?

+0

嘗試編寫'(result.getDouble(「FIELD」):java.lang.Double)!= null' –

回答

2

如果我理解正確,那是因爲scala中的Double不能爲空。

在控制檯中嘗試一些簡單的外面傳來了錯誤:

scala> val d:Double = null 
<console>:13: error: type mismatch; 
found : Null(null) 
required: Double 

在另一方面,java.lang.Double可以爲空:

scala> val d:java.lang.Double = null 
d: java.lang.Double = null 

所以你的雙可能是斯卡拉Double與Java相反Double

編輯我戳了一下,它看起來像使用java.sql.ResultSet的getDouble方法將返回一個scala Double對象,它佔了警告。至於檢查null的替代方案,我不確定這是否是一種選擇。在Java中,該方法返回了原始的double,該默認值爲0.0。我可能是錯的,但我不認爲Java原語可能永遠是null

編輯2刪除了一些比猜測更具推測性的東西。

+0

那麼我該如何在Scala中進行等效測試呢?標準似乎是模式匹配,但我看不到如何在這裏應用 – deltanovember

+0

它將取決於'getDouble'方法的返回類型。如果它返回一個'Option [Double]',那麼你可以測試它爲'None'(與'Some(value)'相對) – Dylan

+0

我在回答中增加了一點 - 現在應該對你更有幫助。 – Dylan

2

問題是關於java.sql比關於scala更多。 getDouble返回不能爲空的double(java)或Double(Scala)。在調用getDouble(或其他相似的)之後,您必須調用wasNull來檢查該字段是否爲空,在這種情況下getDouble返回的值必須被忽略。根據驅動程序,即使字符串字段可能爲空,也可能必須這樣做。 getString可以返回一個空字符串,而不是空字段。

相關問題