オプションのOrnullメソッドにこの余分な暗黙の引数があるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/5315361

質問

の理由は何だろうか (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 非脆弱なタイプの典型的な例です。そのパラメーターがない場合、この方法を記述することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top