Преобразование карты Scala, содержащей Boolean, в карту Java, содержащую java.lang.Boolean - PullRequest
11 голосов
/ 09 марта 2012

Я хотел бы преобразовать карту scala с логическим значением в карту java со значением java.lang.Boolean (для совместимости).

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 для этого преобразования, или есть краткий синтаксис для выполнения преобразования без использования неявных преобразований в этом пакете?

Ответы [ 2 ]

11 голосов
/ 09 марта 2012

Хотя JavaConversions преобразует карту Scala в 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
9 голосов
/ 09 марта 2012

scala.collection.JavaConversions не поможет вам с проблемой scala.Boolean до java.lang.Boolean. Следующее будет работать, используя метод boolean2Boolean из scala.Predef:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...