[英]Why does the Option's orNull method have this superfluous implicit argument?
我想知道(implicit ev: Null <:< A1)
的原因是什么:
sealed abstract class Option[+A] extends Product with Serializable {
def orNull[A1 >: A](implicit ev: Null <:< A1): A1 = this getOrElse null
...
}
豈不
def orNull[A]: A = this getOrElse null
考慮到它似乎甚至不適用於像這樣的值類型
Option(1).orNull
但
Option(1).getOrElse(null)
呢?
Option
的源代碼
並非所有scala類型都可以為null。 特別是,Any有兩個孩子,AnyRef和AnyVal。 AnyRef可以處理null類型。 AnyVal類型可以是JVM上的原語,因此不能為null。 隱式是一種延遲類型檢查,允許Option [String]使用orNull而不是Option [Int]。
注意:Int的盒裝/非盒裝對象/原語的這種二分法在Scala中有非常奇怪的表現形式,例如null.asInstanceOf [Int] == 0 // true。
scala> abstract class Op[A] {
| def getOrElse(b: A): A
| def orNull[A]: A = this getOrElse null
| }
<console>:14: error: type mismatch;
found : Null(null)
required: A
def orNull[A]: A = this getOrElse null
^
因此,對於所有A
, null
不是可接受的類型,僅適用於可空的。 AnyVal
的子類是非可空類型的典型示例。 如果沒有該參數,則無法編寫此方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.