Jak przekonwertować z java.util.Map na mapę Scala

API Java zwraca ajava.util.Map<java.lang.String,java.lang.Boolean>; Chciałbym to umieścić wMap[String,Boolean]

Więc wyobraź sobie, że mamy:

<code>var scalaMap : Map[String,Boolean] = Map.empty
val javaMap = new JavaClass().map()   // Returns java.util.Map<java.lang.String,java.lang.Boolean>
</code>

Nie możesz tego zrobićMap.empty ++ javaMap, ponieważ metoda ++ nie wie o mapach Java. Próbowałem:

<code>scalaMap = Map.empty ++ new collection.jcl.MapWrapper[String,Boolean] {
    override def underlying = javaMap
}
</code>

i:

<code>scalaMap = Map.empty ++ new collection.jcl.MapWrapper[java.lang.String,java.lang.Boolean] {
    override def underlying = javaMap
  }
</code>

Obaj nie potrafią się skompilować z powodu generyków -java.lang.String nie jest tym samym co łańcuch Scala.

Czy jest dobry sposób na zrobienie tego, nie licząc ręcznego kopiowania mapy?

EDIT: Dzięki, wszystkie dobre odpowiedzi, nauczyłem się wiele od nich wszystkich. Popełniłem jednak błąd, zamieszczając tutaj prostszy problem niż ten, który faktycznie mam. Więc jeśli mi pozwolisz, uogólnię pytanie - to, co faktycznie zwraca API, to

<code>java.util.Map<java.lang.String, java.util.Map<SomeJavaEnum,java.lang.String>>
</code>

I muszę to przenieść na Mapę [String, Map [SomeJavaEnum, String]]

Prawdopodobnie nie wydaje się to zbyt skomplikowane, ale dodaje dodatkowy poziom wymazywania typu, a jedynym sposobem, w jaki znalazłem przeniesienie tego na mapę Scala, było jego głębokie skopiowanie (przy użyciu niektórych technik, które zasugerowałeś poniżej) . Czy masz jakieś wskazówki? Rozwiązałem swój problem, definiując niejawną konwersję dla moich dokładnych typów, więc przynajmniej brzydota jest ukryta we własnej właściwości, ale nadal czuje się trochę niezgrabnie, głęboko kopiując partię.

questionAnswers(4)

yourAnswerToTheQuestion