27

Tôi muốn có thể thực hiện như sau, nhưng nó không thành công trong các cuộc gọi đến useMap. Làm cách nào tôi có thể thực hiện chuyển đổi này?Làm thế nào tôi có thể chuyển đổi Scala Bản đồ sang Java Bản đồ với scala.Float để java.Float k/v chuyển đổi

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) 
        ^

Dường như nó hoạt động với Bản đồ [Chuỗi, Chuỗi], nhưng không phải Bản đồ [Int, Float].

+2

xem [http://stackoverflow.com/questions/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer](http://stackoverflow.com/ Câu hỏi/6991340/scala-convert-listint-to-a-java-util-listjava-lang-số nguyên) –

Trả lời

33

Các giải pháp liên quan đến bởi @ pagoda_5b hoạt động: 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] 

Loại vMap[scala.Int, scala.Float], không Map[java.lang.Integer, java.lang.Float].

Bạn có thể thử này:

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

Tôi đã nghĩ đến việc chuyển đổi dữ liệu theo cách thủ công, nhưng may mắn thay một cách tiếp cận "tự động" hơn có sẵn, xem nhận xét của pagoda_5b – rvange

5

Sử dụng scala xác định trước float2Float và sử dụng JavaConverters để thực hiện chuyển đổi một cách rõ ràng.

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