我试图赋予null一个变量是双这样的:阶:null分配给原始
var foo = 0.0
foo = null
然而,这给出了一个错误:空不能隐式转换为double
所以我这样做,而不是:
foo = null.asInstanceOf[Double]
但是foo的新值是0.0
如何我可以将该值设置为空吗?
我试图赋予null一个变量是双这样的:阶:null分配给原始
var foo = 0.0
foo = null
然而,这给出了一个错误:空不能隐式转换为double
所以我这样做,而不是:
foo = null.asInstanceOf[Double]
但是foo的新值是0.0
如何我可以将该值设置为空吗?
你不能。 Double
是一种值类型,您只能将null
分配给引用类型。相反,Scala编译器用默认值0.0替换null
。
在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
。
好的答案,但我不清楚为什么不在Scala中使用null。你不能将null赋给Option [Double]吗? – cosmosa
@ cosmos1990在_anywhere_中使用'null'被认为是不好的做法。您可以将'null'赋值给'Option [Double]',但这样做不是个好主意。有很多[blog](http://www.yegor256.com/2014/05/13/why-null-is-bad.html)[articles](https://www.lucidchart.com/techblog/) 2015/08/31 /最坏的计算机科学错误/),这超出了这个问题的范围,可以帮助解释为什么应该避免空值。 –
你不应该在Scala中使用空,而不是走的,而不是空一看选项,选项[双]特别
val foo = Some(0.0)
foo = Option.empty[Double]
即使Java的介绍它的可选值。
https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html http://www.scala-lang.org/api/2.7.4/scala/Option.html
如果我将foo设置为None,我会得到“None.type不符合期望值Some [Double]”。如果我将它设置为null,它会编译。现在我该如何检索Some [Double]的值?如果我做foo getOrElse(null)我得到一个nullPointerException。 – cosmosa
尝试选项。empty [Double] – mavarazy
foo的类型在这里被推断为'Some [Double]'这不是你想要的,因为它不允许None。 Yuo需要添加类型注释'Option [Double]'或使用'Option(0.0)'而不是'Some(0.0)'。 foo在这里也需要是var而不是val。 – puhlen
要回答你的问题,为什么编译抱怨分配一个空双变量的时候,你可以很容易地通过Scala类层次结构图的理解:
http://docs.scala-lang.org/tutorials/tour/unified-types.html
总之,
因此,它们是scala中的不同类型或类,它类似于将List分配给String。
这个答案非常适合回答为什么你不能将null赋值给一个实例化为Double的变量。但在回答中,我想我正在寻找另一半的答案,如何在Scala中处理这种情况。 – cosmosa
这不是一个完全重复的,但我认为它会回答你的问题:http://stackoverflow.com/questions/10749010/if-an-int-cant-be-null-what-does-null-asinstanceofint -意思。 –