为什么该选项的Ornull方法具有这种多余的隐式参数?
-
24-10-2019 - |
题
我想知道有什么原因 (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
是典型的不可戒断类型的例子。在没有该参数的情况下,不可能编写此方法。
不隶属于 StackOverflow