オプションの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
's ソースコード
解決
すべてのSCALAタイプがヌルになるわけではありません。特に、いずれも2人の子供、AnyRefとAnyvalです。 AnyRefはヌルタイプを処理できます。任意のタイプはJVMのプリミティブである可能性があるため、ヌルにすることはできません。暗黙的なものは、オプション[string]がオプション[int]ではなくornullを使用できるようにする遅延型チェックです。
注:INTが箱に入れられていない/箱のないオブジェクト/プリミティブであるというこの二分法は、null.asinstanceof [int] == 0 // Trueなど、Scalaで非常に奇妙な症状があります。
他のヒント
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