将包含布尔值的 Scala 映射转换为包含 java.lang.Boolean 的 Java 映射

2022-09-03 13:05:32

我想将具有布尔值的scala映射转换为具有java.lang.Boolean值的java映射(用于互操作性)。

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隐式转换与在相同类型上参数化的容器一起工作,但不知道布尔值和java.lang.Boolean之间的转换。

我可以使用JavaConversions魔术来执行此转换,或者是否有简洁的语法来执行转换而不使用该包中的隐式转换?


答案 1

虽然会将 Scala Map 转换为 a,而 Scala 隐式转换为 ,但 Scala 不会执行两次隐式转换来获得所需的类型。JavaConversionsjava.util.Mapscala.Booleanjava.lang.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

答案 2

scala.collection.JavaConversions不会帮助你解决 to 问题。但是,使用scala中的方法,以下内容将起作用。前导符scala.Booleanjava.lang.Booleanboolean2Boolean

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

推荐