我正在尝试将项目从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
答案 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上运行。