soc*_*soc 8 parameters scala implicit scala-option
我想知道这里的原因是什么(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
...
}
Run Code Online (Sandbox Code Playgroud)
岂不
def orNull[A]: A = this getOrElse null
Run Code Online (Sandbox Code Playgroud)
考虑到它似乎甚至不适用于像这样的值类型
Option(1).orNull
Run Code Online (Sandbox Code Playgroud)
但
Option(1).getOrElse(null)
Run Code Online (Sandbox Code Playgroud)
呢?
Option
的源代码
jsu*_*eth 10
并非所有scala类型都可以为null.特别是,Any有两个孩子,AnyRef和AnyVal.AnyRef可以处理null类型.AnyVal类型可以是JVM上的原语,因此不能为null.隐式是一种延迟类型检查,允许Option [String]使用orNull而不是Option [Int].
注意:Int的盒装/非盒装对象/原语的这种二分法在Scala中有非常奇怪的表现形式,例如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
^
Run Code Online (Sandbox Code Playgroud)
所以,null
对于所有人来说A
,这不是一个可接受的类型,只适用于可以为空的类型.子类AnyVal
是非可空类型的典型示例.如果没有该参数,则无法编写此方法.