преобразовать непараметризованную коллекцию Java 1.4 в параметризованную последовательность Scala - PullRequest
2 голосов
/ 20 октября 2010

Как я могу преобразовать java 1.4 Collection в 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 ]

3 голосов
/ 20 октября 2010

Сначала убедитесь, что list имеет тип java.util.List[SVNDirEntry]. Для этого используйте приведение:

list.asInstanceOf[java.util.List[SVNDirEntry]]

После этого неявное преобразование будет разрешено для вас, если вы импортируете объект JavaConversions. В объекте JavaConversions существует неявное преобразование в последовательность Scala. Посмотрите следующий пример со списком строк, передаваемых методу, который ожидает последовательность 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 выше). Или напишите свою собственную функцию, которая выполняет преобразование путем копирования элементов.

2 голосов
/ 20 октября 2010

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

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