我正在移植一些Java代码并具有以下内容
val overnightChanges: java.util.Hashtable[String, Double] = ...
当我尝试
时if (null != overnightChanges.get(...))
我收到以下警告
警告:使用`!='比较Null和Double类型的值将始终产生true
答案 0 :(得分:14)
scala中的原始类型和引用类型与java中的不同,因此惯例是名称以所有类型的大写字母开头。 Double
是scala.Double
,它是原始的java double
,而不是引用java.lang.Double
。
如果在scala中需要“double或no value”,则大多数情况下都会使用Option[Double]
。 Option具有强大的库支持,类型系统不会让您忽略可能没有值。但是,当你需要与java密切交互时,就像在你的例子中一样,你的表确实包含java.lang.Double,你应该这样说。
val a = new java.util.HashMap[String, java.lang.Double]
如果java.lang.Double
开始出现在您的代码中的任何位置,您可以通过导入
import java.lang.{Double => JDouble}
或通过定义
type JDouble = java.lang.Double
scala.Double
和java.lang.Double
之间存在隐式转换,因此互动应该相当顺畅。但是,java.lang.Double
可能应该仅限于scala / java交互层,让它深入到scala代码中会让人感到困惑。
答案 1 :(得分:5)
在Scala中,Double是原语,因此不能为null。当直接使用java地图时,这很烦人,因为当没有定义一个键时,你会得到默认的原始值,(这里是0.0):
scala> val a = new java.util.Hashtable[String,Double]()
a: java.util.Hashtable[String,Double] = {}
scala> a.get("Foo")
res9: Double = 0.0
如果值是String或List之类的对象,则代码应按预期工作。
因此,要解决问题,您可以:
contains
。scala.collection.JavaConversions
中定义)答案 2 :(得分:0)
在Haskell中使用Scala“options”,也称为“maybe”: