8

我想知道这里的原因是什么(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源代码

4

2 回答 2

12

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

注意:这种 Int 被装箱/拆箱对象/基元的二分法在 Scala 中有很奇怪的表现,比如 null.asInstanceOf[Int] == 0 // true。

于 2011-03-15T17:23:39.507 回答
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是不可为空类型的典型示例。在没有该参数的情况下,无法编写此方法。

于 2011-03-15T18:27:50.300 回答