2017-04-02 65 views
1

我试图赋予null一个变量是双这样的:阶:null分配给原始

var foo = 0.0 
foo = null 

然而,这给出了一个错误:空不能隐式转换为double

所以我这样做,而不是:

foo = null.asInstanceOf[Double] 

但是foo的新值是0.0

如何我可以将该值设置为空吗?

+0

这不是一个完全重复的,但我认为它会回答你的问题:http://stackoverflow.com/questions/10749010/if-an-int-cant-be-null-what-does-null-asinstanceofint -意思。 –

回答

6

你不能。 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

+0

好的答案,但我不清楚为什么不在Scala中使用null。你不能将null赋给Option [Double]吗? – cosmosa

+0

@ 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 /最坏的计算机科学错误/),这超出了这个问题的范围,可以帮助解释为什么应该避免空值。 –

1

你不应该在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

+0

如果我将foo设置为None,我会得到“None.type不符合期望值Some [Double]”。如果我将它设置为null,它会编译。现在我该如何检索Some [Double]的值?如果我做foo getOrElse(null)我得到一个nullPointerException。 – cosmosa

+0

尝试选项。empty [Double] – mavarazy

+0

foo的类型在这里被推断为'Some [Double]'这不是你想要的,因为它不允许None。 Yuo需要添加类型注释'Option [Double]'或使用'Option(0.0)'而不是'Some(0.0)'。 foo在这里也需要是var而不是val。 – puhlen

0

要回答你的问题,为什么编译抱怨分配一个空双变量的时候,你可以很容易地通过Scala类层次结构图的理解:

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

enter image description here

总之,

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

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

+0

这个答案非常适合回答为什么你不能将null赋值给一个实例化为Double的变量。但在回答中,我想我正在寻找另一半的答案,如何在Scala中处理这种情况。 – cosmosa