为什么Option的orNull方法有这个多余的隐式参数?

soc*_*soc 8 parameters scala implicit scala-option

我想知道这里的原因是什么(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
  ...
}
Run Code Online (Sandbox Code Playgroud)

岂不

def orNull[A]: A = this getOrElse null
Run Code Online (Sandbox Code Playgroud)

考虑到它似乎甚至不适用于像这样的值类型

Option(1).orNull
Run Code Online (Sandbox Code Playgroud)

Option(1).getOrElse(null)
Run Code Online (Sandbox Code Playgroud)

呢?

Option源代码

jsu*_*eth 10

并非所有scala类型都可以为null.特别是,Any有两个孩子,AnyRef和AnyVal.AnyRef可以处理null类型.AnyVal类型可以是JVM上的原语,因此不能为null.隐式是一种延迟类型检查,允许Option [String]使用orNull而不是Option [Int].

注意:Int的盒装/非盒装对象/原语的这种二分法在Scala中有非常奇怪的表现形式,例如null.asInstanceOf [Int] == 0 // true.


Dan*_*ral 6

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
                                           ^
Run Code Online (Sandbox Code Playgroud)

所以,null对于所有人来说A,这不是一个可接受的类型,只适用于可以为空的类型.子类AnyVal是非可空类型的典型示例.如果没有该参数,则无法编写此方法.