2010-01-29 5 views
3

Я пытаюсь преобразовать проект в scala 2.8 из 2.7, и я столкнулся с некоторыми трудностями в коде, который взаимодействует с 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

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