27

Chciałbym móc wykonać następujące czynności, ale nie powiedzie się w wywołaniu useMap. Jak mogę wykonać tę konwersję?Jak mogę przekonwertować Scala Map na Java Map z scala.Float na java.Float k/v conversion

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> import scala.collection.JavaConverters._ 
import scala.collection.JavaConverters._ 

scala> def useMap(m: java.util.Map[java.lang.Integer, java.lang.Float]) = m 
useMap: (m: java.util.Map[Integer,Float])java.util.Map[Integer,Float] 

scala> val v: Map[Int, Float] = Map() 
v: Map[Int,Float] = Map() 

scala> useMap(v) 
<console>:10: error: type mismatch; 
found : scala.collection.immutable.Map[Int,scala.Float] 
required: java.util.Map[Integer,java.lang.Float] 
       useMap(v) 
        ^

Wygląda na to, że działa z Map [String, String], ale nie Map [Int, Float].

+2

spojrzenie na [http://stackoverflow.com/questions/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer](http://stackoverflow.com/ pytania/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer) –

Odpowiedz

33

Rozwiązanie związana przez @ pagoda_5b działa: Scala convert List[Int] to a java.util.List[java.lang.Integer]

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> val m = mapAsJavaMap(Map(1 -> 2.1f)).asInstanceOf[java.util.Map[java.lang.Integer, java.lang.Float]] 
m: java.util.Map[Integer,Float] = {1=2.1} 

scala> m.get(1).getClass 
res2: Class[_ <: Float] = class java.lang.Float 
3
scala> v.asJava 
<console>:16: error: type mismatch; 
found : java.util.Map[Int,scala.Float] 
required: java.util.Map[Integer,java.lang.Float] 

Rodzaj v jest Map[scala.Int, scala.Float] nie Map[java.lang.Integer, java.lang.Float].

Można spróbować to:

import java.lang.{Float => JFloat} 
useMap(v.map{ case (k, v) => (k: Integer) -> (v: JFloat)}) 
+0

Myślałem o ręcznym przekształceniu danych, ale na szczęście dostępne jest bardziej "automatyczne" podejście, patrz komentarz pagoda_5b – rvange

5

Zastosowanie scala predefiniowane float2Float i używać JavaConverters wykonać konwersję bezpośrednio.

import scala.collection.JavaConverters._ 
val scalaMap = Map(1 -> 1.0F) 
val javaMap = scalaMap.map{ case (k, v) => k -> float2Float(v) }.asJava 
Powiązane problemy