gpt4 book ai didi

api - 请解释使用 Option 的 orNull 方法

转载 作者:行者123 更新时间:2023-12-03 13:19:05 25 4
gpt4 key购买 nike

Scala 的 Option 类有一个 orNull方法,其签名如下所示。

orNull [A1 >: A](implicit ev : <:<[Null, A1]) : A1

我对隐含的事情感到困惑。有人可以解释一下它是如何使用的,最好举个例子吗?

最佳答案

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

解释隐含的事情: orNull 是一种从 Some|None 习语返回到 Java 的 value|null 习语(当然,这是不好的)的方法。现在只有 AnyRef 值(类的实例)可以接受空值。

所以我们想要的是 def orNull[A >: Null] = .... .但是 A 已经设置好了,我们不想在 trait 的定义中限制它。因此, orNull 期望 A 是可空类型的证据。该证据采用隐式变量的形式(因此名称为“ev”)
<:<[Null, A1]可以写成 Null <:< A1看到这样,它类似于'Null <:A1'。 <:< 定义在 Predef 以及提供名为 conforms 的隐式值的方法中。 .

我认为这里没有严格要求使用 A1 并且是因为 orNull 使用 getOrElse (其中给定的默认值可以是 A 的父类(super class)型)
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

关于api - 请解释使用 Option 的 orNull 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4467601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com