使用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):) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |