我想知道有什么原因 (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' 源代码

有帮助吗?

解决方案

并非所有Scala类型都可以为null。特别是,任何人都有两个孩子,Anyref和Anyval。 AnyRef可以处理无效类型。 Anyval类型可能是JVM上的原始类型,因此不能为null。隐式是一个延迟的类型检查,允许选项[String]使用Ornull但不使用Option [INT]。

注意:这种INT的二分法被盒装/未盒子/原始物体/原始性具有非常奇怪的表现,例如null.asinstanceof [int] == 0 // true。

其他提示

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 是典型的不可戒断类型的例子。在没有该参数的情况下,不可能编写此方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top