4

我正在移植一些java代码并具有以下内容

val overnightChanges: java.util.Hashtable[String, Double] = ...

当我尝试

if (null != overnightChanges.get(...))

我收到以下警告

警告:使用 `!=' 比较 Null 和 Double 类型的值将始终产生 true

4

3 回答 3

14

原始类型和引用类型在 scala 中的差异远小于在 java 中的差异,因此约定名称都以大写开头。Doublescala.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 代码中会令人困惑。

于 2011-07-20T08:40:01.697 回答
5

在 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 之类的对象,则您的代码应按预期工作。

所以,要解决这个问题,你可以:

  1. contains在外部 if 条件下使用。
  2. 使用 Scala 映射之一(许多转换在 中定义scala.collection.JavaConversions
于 2011-07-20T05:57:45.750 回答
0

使用 Scala 的“选项”,在 Haskell 中也称为“可能”:

http://blog.danielwellman.com/2008/03/using-scalas-op.html

于 2011-07-20T05:35:22.217 回答