Почему метод Option orNull имеет этот лишний неявный аргумент? - PullRequest
8 голосов
/ 15 марта 2011

Интересно, в чем причина (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 * исходный код

Ответы [ 2 ]

10 голосов
/ 15 марта 2011

Не все типы scala могут быть нулевыми.В частности, Any имеет двоих детей, AnyRef и AnyVal.AnyRef может обрабатывать нулевые типы.Типы AnyVal могут быть примитивами в JVM и поэтому не могут быть нулевыми.Неявная задержанная проверка типов, которая позволяет Option [String] использовать orNull, но не Option [Int].

Примечание. Эта дихотомия типа Int для упакованного / распакованного объекта / примитива имеет очень странные проявления в Scala,например, null.asInstanceOf [Int] == ​​0 // true.

6 голосов
/ 15 марта 2011
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 являются типичными примерами ненулевых типов.В отсутствие этого параметра невозможно написать этот метод.

...