2 Stimmen

unparametrisierte Java 1.4 Collection in parametrisierte Scala Sequence konvertieren

Wie kann ich eine Java 1.4 Collection in eine Scala Seq konvertieren?

Ich versuche, eine Java-Sammlung an eine Scala-Methode zu übergeben:

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]) = ...

Ich erhalte immer diesen Fehler:

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

Also ich schätze, ich muss die parametrisierte Sequenz selbst erstellen, da Scala nur in der Lage ist, eine unparametrisierte Iterable zu erstellen?

3voto

axel22 Punkte 31648

Zunächst müssen Sie sicherstellen, dass list hat den Typ java.util.List[SVNDirEntry] . Verwenden Sie dazu einen Gips:

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

Danach wird die implizite Konvertierung für Sie aufgelöst, wenn Sie die JavaConversions Objekt. Eine implizite Konvertierung in eine Scala-Sequenz existiert in der JavaConversions Objekt. Siehe das folgende Beispiel mit einer Liste von Strings, die an eine Methode übergeben wird, die eine Scala-Sequenz erwartet:

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       

Bei diesen Konvertierungen werden die Elemente nicht kopiert, sondern es wird lediglich ein Wrapper um eine Java-Sammlung konstruiert. Beide Versionen verweisen auf die gleichen zugrunde liegenden Daten. Daher gibt es keine implizite Konvertierung in JavaConversions zu unveränderlichen Scala-Listen aus veränderlichen Java-Listen zu machen, denn das würde es ermöglichen, den Inhalt einer Scala-Sammlung, die garantiert unveränderlich ist, zu ändern.

Kurz gesagt - bevorzugen Seq[...] a List[...] bei der Definition von Parametern für Methoden, wenn Sie mit einer weniger spezifischen Schnittstelle leben können (wie in perform oben). Oder schreiben Sie eine eigene Funktion, die die Umwandlung durch Kopieren der Elemente vornimmt.

2voto

michid Punkte 9389

Sie müssen die Legacy-Sammlung auf den Zieltyp herunterbrechen. Etwas in der Art von:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X