问题描述
Scala的期权类有一个 orNull
方法,其签名如下所示。
orNull [A1计算值:A](隐含EV:<:<空,A1]):A1
我被隐含的东西迷惑。会有人请解释它如何被使用,最好用一个例子?
斯卡拉>一些(1).orNull
<&控制台GT;:10:错误:无法找到参数EV内含价值:其中p:其中p [NULL,INT]
一些(1).orNull
^
斯卡拉> (无:选项[INT])。orNull
<&控制台GT;:10:错误:无法找到参数EV内含价值:其中p:其中p [NULL,INT]
(无:选项[INT])。orNull斯卡拉>有些(HI)。orNull
res21:java.lang.String中=喜斯卡拉>有些(空:字符串).orNull
res22:字符串=空斯卡拉> (无:选项[字符串])orNull。
res23:字符串=空
要解释隐含的事情:orNull是获得来自一些回来的一种方式|无成语Java的价值|空成语(这是当然的,坏)。现在只有AnyRef值(类的实例)可以接受空值。
那么,我们所希望的是 DEF orNull [A计算值:空] = ....
。但是A已经设置,我们不希望限制它的特质的定义。因此,预计orNull证据A是可空类型。这一证据是一个隐含变量(故名EV)
<:<空,A1]
可以写成空<:< A1
看到它这个样子,它类似于空&LT ;: A1。 &所述;:或其可符合
在preDEF以及提供名为隐式值的方法定义。
我觉得用A1的不严格要求在这里,是因为orNull使用getOrElse(其中给出的缺省值可以是超A型)
斯卡拉>类包装[A](选项:选项[A]){
|高清orNull(隐含EV:空<:< A):A = IF(option.isEmpty)空别的option.get
| }
定义的类包装斯卡拉>新包装(有些(HI))。orNull
res18:java.lang.String中=喜
Scala's Option class has an orNull
method, whose signature is shown below.
orNull [A1 >: A](implicit ev : <:<[Null, A1]) : A1
I'm bewildered by the implicit thing. Would somebody please explain how it can be used, ideally with an example?
scala> Some(1).orNull
<console>:10: error: could not find implicit value for parameter ev: <:<[Null,Int]
Some(1).orNull
^
scala> (None : Option[Int]).orNull
<console>:10: error: could not find implicit value for parameter ev: <:<[Null,Int]
(None : Option[Int]).orNull
scala> Some("hi").orNull
res21: java.lang.String = hi
scala> Some(null : String).orNull
res22: String = null
scala> (None : Option[String]).orNull
res23: String = null
To explain the implicit thing: orNull is a way of getting back from the Some|None idiom to Java's value|null idiom (which is, of course, bad). Now only AnyRef values (instances of classes) can accept a null value.
So what we would have liked is def orNull[A >: Null] = ....
. But A is already set and we don't want to restrict it in the definition of the trait. Therefore, orNull expects an evidence that A is a nullable type. This evidence is in the form of an implicit variable (hence the name 'ev')
<:<[Null, A1]
can be written as Null <:< A1
seeing it like this, it is similar to 'Null <: A1'. <:< is defined in Predef as well as the method that provides the implicit value named conforms
.
I think the use of A1 is not strictly required here and is because orNull uses getOrElse (where the default given can be a super type of A)
scala> class Wrapper[A](option: Option[A]) {
| def orNull(implicit ev: Null <:< A): A = if(option.isEmpty) null else option.get
| }
defined class Wrapper
scala> new Wrapper(Some("hi")).orNull
res18: java.lang.String = hi
这篇关于请解释使用期权的orNull方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!