Some和Option有什么区别?
scala> Some(true)
res2: Some[Boolean] = Some(true)
scala> val x: Option[Boolean] = Some(true)
x: Option[Boolean] = Some(true)
scala> res2 == x
res3: Boolean = true我看到Option(null)返回,而Some(null)不会编译:
scala> val x = Option(null)
x: Option[Null] = None
scala> val x: Option[Boolean] = Some(null)
<console>:7: error: an expression of type Null is ineligible for implicit conversion
val x: Option[Boolean] = Some(null)
^发布于 2014-12-23 18:57:45
嗯,Some扩展了Option,因此它继承了除get和isEmpty之外的所有东西(以及其他一些由case类实现的方法)。
Option的伴随对象有一种特殊的处理null的apply方法。
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)但是Some.apply只是为case类生成的标准apply方法。
Some(null)在某些情况下会编译,但是它有类型Some[Null] (或Option[Null]),只有当Option的类型参数是引用类型时才能分配它。
scala> val a = Some(null)
a: Some[Null] = Some(null)
scala> val b: Option[String] = Some(null)
b: Option[String] = Some(null)您试图将Some[Null]分配给Option[Boolean],但是Null不是Boolean的子类型,因为Boolean是值类型(下面是原语),不能保存null的值。
发布于 2014-12-26 11:33:56
总之
Option
/ \
/ \
/ \
Some None选项是容器库,可以是空的或满的。
虽然有些(X)表示容器中的“x”是满的,但没有一个表示空。
发布于 2014-12-23 19:15:09
从函数编程的角度来看,给定任意类型的T,类型OptionT是一种代数数据类型,其数据构造函数为None和Some(x:T)。
这仅仅是一种编码方式,如果类型T由值t1、t2、t3、.那么OptionT类型的所有值都是None、Some(t1)、Some(t2)、Some(t3)、.
大多数其他的事情都是从这个开始的。例如,如果null不是T的值,那么一些(Null)不是OptionT的值。这就解释了为什么
val x: Option[Boolean] = Some(null)不起作用
val x: Option[Null] = Some(null)确实如此。
最后,对于Scala来说,似乎还有另外一个奇怪之处,“为了方便”,当选项(Null)的意思是“None”时,人们可能会说它为“null”。我希望人们也可以说选项(T),当它们指的是一些(T)。
https://stackoverflow.com/questions/27626237
复制相似问题