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

时间:2011-03-15 17:12:41

标签: scala parameters 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
  ...
}

不会

def orNull[A]: A = this getOrElse null

足够考虑它甚至似乎不适用于像

这样的值类型
Option(1).orNull

但是

Option(1).getOrElse(null)

确实

Option的{​​{3}}

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分: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
                                           ^

因此,null不是所有A的可接受类型,仅适用于可以为空的类型。 AnyVal的子类是非可空类型的典型示例。如果没有该参数,则无法编写此方法。