簡體   English   中英

為什么Option的orNull方法有這個多余的隱式參數?

[英]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
                                           ^

因此,對於所有Anull不是可接受的類型,僅適用於可空的。 AnyVal的子類是非可空類型的典型示例。 如果沒有該參數,則無法編寫此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM