我正在移植一些java代码并具有以下内容
val overnightChanges: java.util.Hashtable[String, Double] = ...
当我尝试
if (null != overnightChanges.get(...))
我收到以下警告
警告:使用 `!=' 比较 Null 和 Double 类型的值将始终产生 true
我正在移植一些java代码并具有以下内容
val overnightChanges: java.util.Hashtable[String, Double] = ...
当我尝试
if (null != overnightChanges.get(...))
我收到以下警告
警告:使用 `!=' 比较 Null 和 Double 类型的值将始终产生 true
原始类型和引用类型在 scala 中的差异远小于在 java 中的差异,因此约定名称都以大写开头。Double
是scala.Double
哪个是原始java double
,而不是参考java.lang.Double
。
当您在 scala 中需要“双倍或无值”时,您Option[Double]
大部分时间都会使用。Option 有强大的库支持,类型系统不会让你忽略它可能没有价值。但是,当您需要与 java 密切交互时,如您的示例中,您的表确实包含 java.lang.Double,您应该这样说。
val a = new java.util.HashMap[String, java.lang.Double]
如果java.lang.Double
开始出现在您的代码中的任何地方,您可以通过导入为 JDouble 设置别名
import java.lang.{Double => JDouble}
或通过定义
type JDouble = java.lang.Double
scala.Double
和之间存在隐式转换java.lang.Double
,因此交互应该相当流畅。但是,java.lang.Double
可能应该仅限于 scala/java 交互层,让它深入到 scala 代码中会令人困惑。
在 Scala Double 中是原语,因此不能为空。直接使用 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
在外部 if 条件下使用。scala.collection.JavaConversions
)使用 Scala 的“选项”,在 Haskell 中也称为“可能”: