2010-01-29 56 views
3

我试图将项目从2.7转换为scala 2.8,并且遇到了与Java交互的代码中的一些困难。下面是一段显示问题的示例代码。基本上我有一个mutable.Map[K,V]类型的成员变量类,我无法找到一种方法将其传递给期望java.util.Map[K,V]的方法。任何帮助都会很棒。scala 2.8 implict java集合转换

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 

回答

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] = [email protected] 

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

谢谢帕特里克。这工作完美。我不想重复转换,这个例子只是显示我遇到的问题的最简单的方法。 – Dave 2010-01-29 14:14:46

5

Easi LY解:

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

虽然,如前所述,它引出了一个问题,为什么你费心去复制这种方法,这你可以从JavaConversions直接调用,甚至含蓄地使用它。当然,你可能有充足的理由,或者你可能只是为了解决转换如何在Scala 2.7上工作。

+1

像平常一样聪明+1 – Patrick 2010-01-29 13:52:31