2010-01-29 127 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