【问题标题】:Why does the Option's orNull method have this superfluous implicit argument?为什么 Option 的 orNull 方法有这个多余的隐式参数?
【发布时间】:2011-03-15 17:12:40
【问题描述】:

我想知道这里(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)

会吗?

Optionsource code

【问题讨论】:

  • Option(1).getOrElse(null) "works",但是整体类型是 Any,不是很有帮助的类型。

标签: scala parameters implicit scala-option


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    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 的子类是不可为空类型的典型示例。在没有该参数的情况下,无法编写此方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2015-09-30
      • 2011-02-12
      • 2023-04-06
      • 2015-10-23
      • 1970-01-01
      相关资源
      最近更新 更多