API Java возвращает java.util.Map<java.lang.String,java.lang.Boolean>
;. Я хотел бы добавить это в Map[String,Boolean]
Итак, представьте, что у нас есть:
var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map() // Returns java.util.Map<java.lang.String,java.lang.Boolean>
Вы не можете сделать Map.empty ++ javaMap
, потому что метод ++ не знает о картах Java. Я пробовал:
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
override def underlying = javaMap
}
и
scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
override def underlying = javaMap
}
Оба они не скомпилируются из-за генериков - java.lang.String
не совпадает с строкой scala.
Есть ли хороший способ сделать это, не скопировав карту вручную?
EDIT: Спасибо, все хорошие ответы, я многому научился у всех из них. Однако я допустил ошибку, разместив здесь более простую проблему, чем тот, который у меня есть. Итак, если вы позволите мне, я обобщу вопрос: что API API действительно возвращает
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
И мне нужно переместить это в Map [String, Map [SomeJavaEnum, String]]
Вероятно, это не слишком усложняется, но добавляет дополнительный уровень стирания типа, и единственный способ, которым я нашел перемещение на карту scala, - это глубокое копирование (используя некоторые из методы, предложенные ниже). Любой намек? Я как бы решил проблему, определив неявное преобразование для своих точных типов, поэтому, по крайней мере, уродство скрыто в его собственном признаке, но все же чувствует себя немного неуклюжим, глубоко копируя лот.