2010-01-29 6 views
3

Je suis en train de convertir un projet en scala 2.8 de 2.7 et j'ai rencontré des difficultés dans le code qui interagit avec Java. Ci-dessous se trouve un exemple de code légèrement alambiqué illustrant le problème. Essentiellement, j'ai classe avec une variable membre de type mutable.Map[K,V] et je ne trouve pas un moyen de transmettre cela à une méthode qui attend un java.util.Map[K,V]. Toute aide est la bienvenue.scala 2.8 impliquer des conversions de Java conversions

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 

Répondre

5

Je ne sais pas pourquoi vous essayez de répéter la conversion de JavaConversions, mais je pense que vous pouvez le faire avec l'ajout du paramètre implicite ma demandé:

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 
} 

De console

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

Merci Patrick. Cela a fonctionné parfaitement. Je n'essaie pas de répéter les conversions, cet exemple était le moyen le plus simple de montrer le problème que j'avais. – Dave

5

Easi ment résoluble:

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

Bien que, comme mentionné, on peut se poser la question de savoir pourquoi vous donner la peine de reproduire cette méthode, vous pouvez appeler directement à partir JavaConversions, ou même utiliser implicitement. Vous pourriez avoir de bonnes raisons à cela, bien sûr, ou vous l'avez fait simplement pour comprendre comment les conversions ont fonctionné sur Scala 2.7.

+1

Clever comme d'habitude +1 – Patrick