3

我正在尝试将项目从 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
4

2 回答 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}
于 2010-01-29T13:19:35.883 回答
5

容易解决:

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

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

于 2010-01-29T13:44:53.327 回答