8

ここの理由は何だろうか(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ソースコード

4

2 に答える 2

12

すべての scala 型が null になるわけではありません。特に、Any には AnyRef と AnyVal という 2 つの子があります。AnyRef は null 型を処理できます。AnyVal 型は JVM のプリミティブである可能性があるため、null にすることはできません。暗黙的は、Option[String] が orNull を使用できるが Option[Int] は使用できない遅延型チェックです。

注: Int がボックス化されている/ボックス化されていないオブジェクト/プリミティブであるというこの二分法は、null.asInstanceOf[Int] == 0 // true など、Scala では非常に奇妙な形で現れます。

于 2011-03-15T17:23:39.507 に答える
6
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、null 許容のものに対してのみ受け入れられます。のサブクラスは、AnyValnull 非許容型の典型的な例です。そのパラメータがない場合、このメソッドを記述することはできません。

于 2011-03-15T18:27:50.300 に答える