scala:将null赋给基元

时间:2017-04-02 12:55:40

标签: scala

我正在尝试将null赋给像这样的Double变量:

var foo = 0.0
foo = null

但是,这会产生一个错误,即无法将null隐式转换为Double

所以我这样做了:

foo = null.asInstanceOf[Double]

然而foo的新值是0.0

如何将值设置为null?

4 个答案:

答案 0 :(得分:9)

你不能。 Double是值类型,您只能将null指定给引用类型。相反,Scala编译器将null替换为默认值0.0。

请参阅SLS 4.2中的默认值:

default  type
0        Int or one of its subrange types
0L       Long
0.0f     Float
0.0d     Double
false    Boolean

您也无法将Java基元分配给null。虽然Scala的Double并不是真正的原语(它实际上是Scala中的一个类),但它需要在Java字节代码中编译为double。相反,如果要表示完全缺失的值,则应使用Option[Double],并尝试永远在Scala中使用null

答案 1 :(得分:1)

另一种(也许是最简单的)方法就是使用java.lang.Double而不是scala.Double,并分配给java.lang.Double.NaN而不是null。

然后你可以做

if(foo.isNaN) { work around not a number case } else { usual case }

使用变量时。

我说这可能是最简单的,因为如果你的目的是能够检查Double值的Not-Available(或不存在)状态,那么否则使用通常的Double算术&运算符,然后使用java float原语比别名更简单,否则解决Option [Double]的包装类。

请参阅:Option[Double] arithmetic operatorsCan float (or double) be set to NaN?

答案 2 :(得分:0)

你不应该在Scala中使用null,而是看看Option,Option [Double]具体

val foo = Some(0.0)
foo = Option.empty[Double]

即便是Java引入了它的可选值,而不是null。

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html http://www.scala-lang.org/api/2.7.4/scala/Option.html

答案 3 :(得分:0)

要回答你的问题,为什么编译器在将null赋给double变量时会抱怨,你可以通过scala类层次结构图轻松理解:

http://docs.scala-lang.org/tutorials/tour/unified-types.html

enter image description here

简而言之,

  • Double是Anyval的子类
  • null(Null的实例)是AnyRef的子类。

因此它们是scala中的不同类型或类,它类似于将List分配给String。