преобразование непараметризованной коллекции Java 1.4 в параметризованную последовательность Scala
Как я могу преобразовать коллекцию java 1.4 в Scala Seq?
Я пытаюсь передать java-коллекцию в метод scala:
import scala.collection.JavaConversions._
// list is a 1.4 java.util.ArrayList
// repository.getDir is Java legacy code
val list = repository.getDir(...)
perform(list)
def perform(entries: List[SVNDirEntry]) = ...
Я всегда получаю эту ошибку:
type mismatch; found : java.util.Collection[?0] where type ?0 required: List
[SVNDirEntry]
Итак, я предполагаю, что должен создать параметризованную последовательность сам, поскольку Scala может создать только непараметризованную итерацию?
2 ответа:
Сначала вы должны убедиться, что
list
имеет типjava.util.List[SVNDirEntry]
. Для этого используйте приведение:list.asInstanceOf[java.util.List[SVNDirEntry]]
После этого неявное преобразование будет разрешено для вас, если вы импортируете объект
JavaConversions
. Неявное преобразование в последовательность Scala существует в объектеJavaConversions
. Смотрите следующий пример со списком строк, передаваемых методу, который ожидает последовательность Scala:scala> val jvlist: java.util.List[_] = new java.util.ArrayList[String] jvlist: java.util.List[_] = [] scala> jvlist.asInstanceOf[java.util.List[String]] res0: java.util.List[String] = [] scala> import collection.JavaConversions._ import collection.JavaConversions._ scala> def perform(scalaseq: Seq[String]) = println("ok") perform: (scalaseq: scala.collection.Seq[String])Unit scala> perform(res0) ok
Эти преобразования не копируют элементы-они просто создают оболочку вокруг Java коллекция. Обе версии указывают на одни и те же базовые данные. Таким образом, в
Короче говоря-предпочитайтеJavaConversions
нет неявного преобразования в неизменяемые списки Scala из изменяемых списков Java, поскольку это позволило бы изменить содержимое коллекции Scala, которая гарантированно является неизменяемой.Seq[...]
List[...]
при определении параметров для методов, если вы можете жить с менее специфичным интерфейсом (как вperform
выше). Или напишите свою собственную функцию, которая выполняет преобразование путем копирования элементов.