41

I would like to be able to perform the following, but it fails in the call to useMap. How can I perform this 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)
                     ^

It seems to work with Map[String, String], but not Map[Int, Float].

om-nom-nom
  • 62,329
  • 13
  • 183
  • 228
rvange
  • 2,432
  • 2
  • 20
  • 23
  • 2
    look at [http://stackoverflow.com/questions/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer](http://stackoverflow.com/questions/6991340/scala-convert-listint-to-a-java-util-listjava-lang-integer) – pagoda_5b May 16 '13 at 12:46

4 Answers4

45

The solution linked to by @pagoda_5b works: 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
Community
  • 1
  • 1
rvange
  • 2,432
  • 2
  • 20
  • 23
  • 6
    For anyone stumbling upon this now, `scala.collection.JavaConversions` is deprecated since Scala 2.8. Please refer to @cyber4ron 's answer. – Pulasthi Bandara May 14 '18 at 11:37
  • An important thing to note here is `scala.Float` is not the same type as `java.lang.Float` – Litchy Dec 08 '21 at 06:46
32

Use scala predefined float2Float and use CollectionConverters to perform conversion explicitly.

import scala.jdk.CollectionConverters._
// Prior to Scala 2.13: import scala.collection.JavaConverters._
val scalaMap = Map(1 -> 1.0F)
val javaMap = scalaMap.map{ case (k, v) => k -> float2Float(v) }.asJava
AdamBat
  • 83
  • 1
  • 5
cyber4ron
  • 468
  • 5
  • 7
11

Implicit conversions are sometimes hard to debug/understand and therefore I prefer explicit conversions as follows:

import scala.collection.JavaConversions.mapAsJavaMap

val scalaMap = Map(1 -> 1.0F)
val javaMap = mapAsJavaMap(scalaMap)
Shrey
  • 2,374
  • 3
  • 21
  • 24
3
scala> v.asJava
<console>:16: error: type mismatch;
 found   : java.util.Map[Int,scala.Float]
 required: java.util.Map[Integer,java.lang.Float]

The type of v is Map[scala.Int, scala.Float], not Map[java.lang.Integer, java.lang.Float].

You could try this:

import java.lang.{Float => JFloat}
useMap(v.map{ case (k, v) => (k: Integer) -> (v: JFloat)})
senia
  • 37,745
  • 4
  • 88
  • 129
  • I did think of converting the data manually, but fortunately a more "automatic" approach is available, see the comment by pagoda_5b – rvange May 17 '13 at 12:20