2017-04-02 68 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