誰能解釋一下scala中的以下行為?
基本上在下面的代碼中,如果你這樣做getOptionValue[Int](None)
,它會回傳 0 但是當你這樣做getOptionValue[Int](None).toString
時會導致空指標例外。
結果不應該是 0 轉換成字串(即“0”)嗎?
PS:我使用的是 scala 2.12.10
scala> def getOptionValue[T](option: Option[T]): T = {
| if (option.isEmpty) {
| null.asInstanceOf[T]
| } else
| option.get
| }
getOptionValue: [T](option: Option[T])T
scala> getOptionValue[Int](None)
res35: Int = 0
scala> res35.toString
res36: String = 0
scala> getOptionValue[Int](None).toString
java.lang.NullPointerException
... 47 elided
下面的作業也很好
scala> null.asInstanceOf[Int]
res0: Int = 0
scala> null.asInstanceOf[Int].toString
res1: String = 0
uj5u.com熱心網友回復:
這些:
null.asInstanceOf[Int]
null.asInstanceOf[Int].toString // "0"
是相當(不可靠)的例外。
在 JVM 上呼叫null
參考的任何方法都以NullPointerException
.
Scala 并不總是將其scala.Int
視為java.lang.Integer
(可以為空),也不會始終將其視為int
(原始的,設計上不可為空)——它使用基于背景關系的任何一種表示。
如果null.asInstanceOf[Int]
Scala 實際上會執行轉換而不是強制轉換,這就是為什么你會得到0
. 但它只能在知道轉換型別 ( Null
) 和目標型別 ( Int
) 時執行此轉換,因為在型別擦除之后它不會執行此類技巧。
這就是為什么當您使用泛型時,Scala 只會知道null
強制轉換為某個參考型別,方法定義對存在T
一無所知,因此它不會執行轉換,它仍然會從方法回傳,并且然后它會拋出 NPE 。T
Int
null
.toString
首先存在這些例外的原因是,當您遇到以下情況時可能感覺很糟糕:
val a: Int = null.asInstanceOf[Int]
編譯器很可能會使用int
, 強制轉換沒有意義,所以他們選擇了轉換,這樣原語就會得到值,0
而不是編譯或運行時錯誤。但這只有在您知道您的目標是原始型別(Int
, Double
, Char
, ...)時才能完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/487592.html