Scala 2.8 隐式 Java 集合转换

3

我正在将一个项目从Scala 2.7转换到Scala 2.8,但是在与Java交互的代码中遇到了一些困难。下面是一个有点复杂的示例代码,显示了问题。本质上,我有一个带有类型为mutable.Map[K,V]的成员变量的类,但我找不到一种方法将其传递给期望一个java.util.Map[K,V]的方法。任何帮助都将是非常好的。

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

scala> class A[K,V](m : collection.mutable.Map[K,V]) { 
     | def asJava : java.util.Map[K,V] = m
     | }

<console>:9: error: could not find implicit value for parameter ma: scala.reflect.ClassManifest[K]
       def asJava : java.util.Map[K,V] = m
2个回答

5

我不知道你为什么要重复使用JavaConversions进行转换,但我认为你可以通过添加所需的隐式参数ma来完成:

import scala.collection.JavaConversions._
class A[K,V](m : collection.mutable.Map[K,V]) {
 def asJava(implicit ma:ClassManifest[K]) : java.util.Map[K,V] = m
}

来自控制台

scala> import scala.collection.JavaConversions._
class A[K,V](m : collection.mutable.Map[K,V]) {
 def asJava(implicit ma:ClassManifest[K]) : java.util.Map[K,V] = m
}
import scala.collection.JavaConversions._

scala>
defined class A

scala> val map=scala.collection.mutable.HashMap[Int, Int]()
map: scala.collection.mutable.HashMap[Int,Int] = Map()

scala> map += 0->1
res3: map.type = Map(0 -> 1)

scala> val a=new A(map)
a: A[Int,Int] = A@761635

scala> a.asJava
res4: java.util.Map[Int,Int] = {0=1}

谢谢Patrick。那个完美地解决了我的问题。我不是在尝试重复转换,那个例子只是最容易展示我遇到的问题的方式。 - David

5

易于解决:

class A[K : ClassManifest,V](m : collection.mutable.Map[K,V]) {
  def asJava : java.util.Map[K,V] = m
}

虽然如前所述,这引出了一个问题,即为什么你要费心复制这种方法,而不是直接从JavaConversions中调用它,甚至可以隐式地使用它。当然,你可能有充分的理由这样做,或者你可能只是为了避开Scala 2.7上的转换工作而这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接