本文介绍了请解释使用期权的orNull方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-19 03:24