我試圖賦予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 -意思。 –