我正在尝试将null赋给像这样的Double变量:
var foo = 0.0
foo = null
但是,这会产生一个错误,即无法将null隐式转换为Double
所以我这样做了:
foo = null.asInstanceOf[Double]
然而foo的新值是0.0
如何将值设置为null?
答案 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 operators 和Can 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
简而言之,
因此它们是scala中的不同类型或类,它类似于将List分配给String。