下面是一個相當標準件的Java代碼已被翻譯成斯卡拉爲什麼在將以下內容從Java轉換爲Scala時,會出現「總會產生錯誤」警告?
val result: ResultSet = statement.executeQuery(query)
while (result.next) {
if (result.getDouble("FIELD") != null) {
}
}
爲什麼我得到
警告:使用`比較類型的雙和空值=」將 !總是屈服於真實?
下面是一個相當標準件的Java代碼已被翻譯成斯卡拉爲什麼在將以下內容從Java轉換爲Scala時,會出現「總會產生錯誤」警告?
val result: ResultSet = statement.executeQuery(query)
while (result.next) {
if (result.getDouble("FIELD") != null) {
}
}
爲什麼我得到
警告:使用`比較類型的雙和空值=」將 !總是屈服於真實?
如果我理解正確,那是因爲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刪除了一些比猜測更具推測性的東西。
那麼我該如何在Scala中進行等效測試呢?標準似乎是模式匹配,但我看不到如何在這裏應用 – deltanovember
它將取決於'getDouble'方法的返回類型。如果它返回一個'Option [Double]',那麼你可以測試它爲'None'(與'Some(value)'相對) – Dylan
我在回答中增加了一點 - 現在應該對你更有幫助。 – Dylan
問題是關於java.sql比關於scala更多。 getDouble返回不能爲空的double(java)或Double(Scala)。在調用getDouble(或其他相似的)之後,您必須調用wasNull來檢查該字段是否爲空,在這種情況下getDouble返回的值必須被忽略。根據驅動程序,即使字符串字段可能爲空,也可能必須這樣做。 getString可以返回一個空字符串,而不是空字段。
嘗試編寫'(result.getDouble(「FIELD」):java.lang.Double)!= null' –