Scala 2.8 имплицирует преобразования Java-коллекций - PullRequest
3 голосов
/ 29 января 2010

Я пытаюсь преобразовать проект в scala 2.8 из 2.7, и я столкнулся с некоторыми трудностями в коде, который взаимодействует с Java. Ниже приведен слегка запутанный фрагмент кода, отображающий проблему. По сути, у меня есть класс с переменной-членом типа mutable.Map[K,V], и я не могу найти способ передать это методу, который ожидает 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

Ответы [ 2 ]

5 голосов
/ 29 января 2010

Легко решаемо:

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

Хотя, как уже упоминалось, возникает вопрос о том, почему вы пытаетесь воспроизвести этот метод, который вы можете вызвать напрямую из JavaConversions или даже использовать его неявно. Конечно, у вас могут быть на то веские причины, или вы могли бы сделать это просто, чтобы узнать, как конверсии работали в Scala 2.7.

5 голосов
/ 29 января 2010

Я не знаю, почему вы пытаетесь повторить преобразование из 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] = A@761635

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