gpt4 book ai didi

scala - 使用空参数从Scala调用Java API

转载 作者:行者123 更新时间:2023-12-04 13:49:43 26 4
gpt4 key购买 nike

我有一些需要调用Java API的Scala代码

Java API接受的参数可以为null。我的Scala当然使用Option

例如,假设我有一个Java对象构造函数Foo(Integer),其中Integer可以是null。我想给它命名为Scala bar: Option[Int]

我试过了

import scala.collection.JavaConversions._
import scala.collection.JavaConverters._

val foo = Foo( bar.getOrElse(null) )

但是得到了这个编译错误
Error:(335, 44) type mismatch;
found : Any
required: Integer
bar.getOrElse(null),

这样做的正确习惯是什么?

最佳答案

您不需要Java方法即可重现此问题:

scala> import scala.collection.JavaConversions._
import scala.collection.JavaConversions._

scala> import scala.collection.JavaConverters._
import scala.collection.JavaConverters._

scala> class Foo(a: java.lang.Integer)
defined class Foo

scala> val bar: Option[Int] = Some(5)
bar: Option[Int] = Some(5)

scala> new Foo(bar.getOrElse(null))
<console>:16: error: type mismatch;
found : Any
required: Integer
new Foo(bar.getOrElse(null))
^

问题是 Int不能是 null,因此 bar.getOrElse(null)的类型是 Any
scala> bar.getOrElse(null)
res0: Any = 5

scala> bar.orNull
<console>:15: error: Cannot prove that Null <:< Int.
bar.orNull
^

因此,您必须先将 Option的type参数转换为可以是 null的某种参数,然后再以可为空的方式对其进行解包。

我可以立即想到的最快方法:
scala> new Foo(bar.map(x => x: java.lang.Integer).orNull)
res18: Foo = Foo@cdc45e

编辑:在这里,我想到了一种更通用的方法!
implicit class RichOption[A](o: Option[A]) {
def toRef[B >: Null](implicit f: A => B): B = o.map(f).orNull
}

现在您可以编写 new Foo(bar.toRef)了:)

关于scala - 使用空参数从Scala调用Java API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27611133/

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