scala 2.8隐式java集合转换

时间:2010-01-29 12:25:16

标签: scala type-conversion scala-2.8

我正在尝试将项目从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 个答案:

答案 0 :(得分: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}

答案 1 :(得分:5)

易于解决:

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

尽管如上所述,它引出了一个问题,为什么你很难复制这个方法,你可以直接从JavaConversions调用,或者甚至隐式地使用它。当然,你可能有充分的理由,或者你可能只是为了解决转换如何在Scala 2.7上运行。