2010-10-20 5 views
2

Comment convertir une collection java 1.4 en Scala Seq?convertir une collection Java 1.4 non paramétrée en une séquence Scala paramétrée

Je suis en train de passer un java-collection à une méthode 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]) = ... 

Je reçois toujours cette erreur:

type mismatch; found : java.util.Collection[?0] where type ?0 required: List 
[SVNDirEntry] 

Je suppose que je dois créer la séquence paramétrés moi-même comme Scala est seulement capable de créer un Iterable non paramétré?

Répondre

3

D'abord, vous devez vous assurer que list a le type java.util.List[SVNDirEntry]. Pour ce faire, utilisez un casting:

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

Après cela, la conversion implicite sera résolu pour vous si vous importez l'objet JavaConversions. Une conversion implicite vers une séquence Scala existe dans l'objet JavaConversions. Voir l'exemple suivant avec une liste de chaînes étant passé à une méthode qui attend une séquence 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  

Ces conversions ne copient pas les éléments - ils construisent simplement une enveloppe autour d'une collection Java. Les deux versions pointent vers les mêmes données sous-jacentes. Ainsi, il n'y a pas de conversion implicite en JavaConversions pour les listes Scala immuables de listes Java mutables, car cela permettrait de changer le contenu d'une collection Scala qui est garanti immuable. En bref, préférez Seq[...] à List[...] lors de la définition de paramètres pour les méthodes si vous pouvez vivre avec une interface moins spécifique (comme dans perform ci-dessus). Ou écrivez votre propre fonction qui fait la conversion en copiant les éléments.

2

Vous devez convertir la collection héritée en type de cible. Quelque chose le long des lignes de:

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

Merci beaucoup, ça m'a aidé! – trajectory

+0

Vous êtes le seul à lancer la collection Scala, pas celle de Java. –

Questions connexes