scala 2.8暗示java集合转换

Dav*_*ave 3 scala type-conversion scala-2.8

我正在尝试将项目从2.7转换为scala 2.8,并且我在与Java交互的代码中遇到了一些困难.下面是一个显示问题的稍微复杂的示例代码.基本上我有一个类型的成员变量的类mutable.Map[K,V],我找不到一种方法将其传递给期望a的方法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
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 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
}
Run Code Online (Sandbox Code Playgroud)

从控制台

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}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 5

易于解决:

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

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