Java API возвращает 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.
Есть ли хороший способ сделать это, кроме копирования карты вручную?
РЕДАКТИРОВАТЬ: Спасибо, все хорошие ответы, я многому научился у всех. Однако я допустил ошибку, разместив здесь более простую проблему, чем та, которая у меня есть на самом деле. Итак, если вы позволите мне, я обобщу вопрос - что API на самом деле возвращает
java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
И мне нужно переместить это в Map [String, Map [SomeJavaEnum, String]]
Возможно, это не слишком сложное явление, но оно добавляет дополнительный уровень стирания типов, и единственный способ, которым я обнаружил перемещение этого на карту Scala, - это его глубокое копирование (используя некоторые предложено ниже). Есть какие-нибудь намеки? Я вроде как решил свою проблему, определив неявное преобразование для моих точных типов, так что, по крайней мере, уродство скрыто в его собственной черте, но все же кажется немного неуклюжимым, копируя всю партию.