加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用null参数从Scala调用Java API

发布时间:2020-12-16 19:00:33 所属栏目:安全 来源:网络整理
导读:我有一些需要调用 Java API的Scala代码 Java API接受可能为null的参数.我的Scala当然使用Option. 例如,假设我有一个Java对象构造函数Foo(Integer),其中Integer可以为null.我想在Scala栏中调用它:Option [Int]. 我试过这个 import scala.collection.JavaConv
我有一些需要调用 Java API的Scala代码

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

例如,假设我有一个Java对象构造函数Foo(Integer),其中Integer可以为null.我想在Scala栏中调用它: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的类型参数转换为可以为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
}

现在你可以写新的Foo(bar.toRef):)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读