Scala Some v. Option

前端 未结 4 2015
甜味超标
甜味超标 2021-02-03 20:14

What\'s the difference between Some and Option?

scala> Some(true)
res2: Some[Boolean] = Some(true)

scala> val x: Option[Boolean]         


        
4条回答
  •  隐瞒了意图╮
    2021-02-03 21:03

    Well, Some extends Option, so it inherits everything except get and isEmpty (and some other methods implemented by a case class).

    The companion object of Option has a special apply method for dealing with null:

    def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
    

    But Some.apply is just the standard apply method generated for a case class.

    Some(null) will compile in some circumstances, but it has type Some[Null] (or Option[Null]), which can only be assigned when the type argument of Option is a reference type.

    scala> val a = Some(null)
    a: Some[Null] = Some(null)
    
    scala> val b: Option[String] = Some(null)
    b: Option[String] = Some(null)
    

    You're trying to assign a Some[Null] to an Option[Boolean], but a Null is not a sub-type of Boolean, because Boolean is a value type (primitive underneath) and cannot hold a value of null.

提交回复
热议问题