Conversion d'énumération en itérateur
-
20-08-2019 - |
Question
J'ai la conversion implicite suivante pour java.util.Enumerations
implicit def enumerationIterator[A](e : Enumeration[A]) : Iterator[A] = {
new Iterator[A] {
def hasNext = e.hasMoreElements
def next = e.nextElement
def remove = throw new UnsupportedOperationException()
}
}
Malheureusement, cela ne fonctionne pas pour ZipFile.entries
car elle renvoie un Enumeration<? extends ZipEntry>
(voir question connexe ) et Scalac me répète sans cesse
type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
Je ne vois pas comment faire fonctionner la conversation avec qch. comme
List.fromIterator(new ZipFile(z).entries))
La solution
List.fromIterator attend un scala.Iterator mais votre implicite renvoie un java.util.Iterator.
Cela fonctionne
import java.util.Enumeration
implicit def enum2Iterator[A](e : Enumeration[A]) = new Iterator[A] {
def next = e.nextElement
def hasNext = e.hasMoreElements
}
import java.util.zip.{ZipFile, ZipEntry}
val l = List.fromIterator(new ZipFile(null:java.io.File).entries)
L'ajout d'une importation en haut empêche la compilation
import java.util.Iterator
Il a été question d'unifier Scala et Java dans la version 2.8 en utilisant simplement java.util.Iterator. Inconvénient, Iterator de Java a une méthode de suppression qui n’a aucun sens pour les collections immuables de Scala. UnsupportedOperationException? Blech! Du côté des points positifs, des choses comme cette erreur disparaissent.
Modifier: j'ai ajouté un problème Trac selon lequel le message d'erreur aurait été plus clair s'il avait déclaré & "Requis: scala.Iterator [?] &"; https://lampsvn.epfl.ch/trac/scala/ticket/2102
Autres conseils
Pour autant que je sache, Énumération dans Scala 2.7.x a un " éléments & "; method et Scala 2.8.0 a un " itérateur " méthode returing un itérateur. Pourquoi ne pas les utiliser?
Oh, peu importe, peu importe. Énumération de Java.