我想知道这里(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}}
答案 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
的子类是非可空类型的典型示例。如果没有该参数,则无法编写此方法。