我想把一个带有布尔值的scala map转换成一个带有java.lang.Boolean值的java map (为了互操作性)。
import scala.collection.JavaConversions._
val a = Map[Int, Boolean]( (1, true), (2, false) )
val b : java.util.Map[Int, java.lang.Boolean] = a
失败,出现以下错误:
error: type mismatch;
found : scala.collection.immutable.Map[Int,scala.Boolean]
required: java.util.Map[Int,java.lang.Boolean]
val b : java.util.Map[Int, java.lang.Boolean] = a
JavaConversions隐式转换可以很好地处理在相同类型上参数化的容器,但不知道Boolean和java.lang.Boolean之间的转换。
我可以使用JavaConversions魔术来做这个转换吗,或者有没有一种简洁的语法来做这个转换而不使用该包中的隐式转换?
发布于 2012-03-09 18:23:24
虽然JavaConversions
会将Scala Map转换为java.util.Map
,而Scala隐式地将scala.Boolean
转换为java.lang.Boolean
,但Scala不会执行两次隐式转换来获得您想要的类型。
Boolean
提供了一个用于显式转换的box
方法。
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(Boolean.box)
如果您经常在代码中执行此操作,则可以为所有Map[T, Boolean]
定义自己的隐式转换。
import scala.collection.JavaConversions._
implicit def boolMap2Java[T](m: Map[T, Boolean]):
java.util.Map[T, java.lang.Boolean] = m.mapValues(Boolean.box)
val b: java.util.Map[Int, java.lang.Boolean] = a
发布于 2012-03-09 17:55:25
scala.collection.JavaConversions
不会帮助您解决scala.Boolean
到java.lang.Boolean
的问题。不过,通过使用scala.Predef
中的boolean2Boolean
方法,以下方法将起作用
val a = Map[Int, Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(boolean2Boolean)
或者,您可以使用Java的Boolean(boolean value)
构造函数:
val a = Map[Int, Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] =
a.mapValues(new java.lang.Boolean(_))
或者,您可以只声明第一个映射来使用Java引用类型:
val a = Map[Int, java.lang.Boolean](1 -> true, 2 -> false)
val b: java.util.Map[Int, java.lang.Boolean] = a
https://stackoverflow.com/questions/9638492
复制相似问题