преобразование непараметризованной коллекции 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 2

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 выше). Или напишите свою собственную функцию, которая выполняет преобразование путем копирования элементов.

Вы должны привести устаревшую коллекцию к целевому типу. Что-то вроде:

perform(list.asInstanceOf[List[SVNDirEntry]])