Konvertieren von Enumeration Iterator
-
20-08-2019 - |
Frage
Ich habe die folgende implizite Konvertierung für 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()
}
}
Leider ist es nicht für ZipFile.entries
arbeiten, weil es eine Enumeration<? extends ZipEntry>
zurückgibt (siehe verwandten Frage ) und Scalac sagt mir,
type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
Ich kann nicht herausfinden, wie das Gespräch Arbeit in etw. wie
List.fromIterator(new ZipFile(z).entries))
Lösung
List.fromIterator erwartet eine scala.Iterator aber Ihre implizite ein java.util.Iterator zurück.
Das funktioniert
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)
Das Hinzufügen einer Import an der Spitze verhindert Kompilation
import java.util.Iterator
Es gab einige Diskussionen über die Vereinheitlichung Scala und Java in 2,8 von nur java.util.Iterator verwenden. Auf der anderen Seite hat die Java Iterator eine remove-Methode, die keinen Sinn für Scala unveränderlich Sammlungen macht. UnsupportedOperationException? Blech! Auf der positiven Seite das macht Sachen wie dieser Fehler weg.
Edit: Ich habe ein Problem Trac fügt hinzu, dass die Fehlermeldung klarer gewesen wäre, hatte es gesagt "erforderlich: [?] Scala.Iterator" https://lampsvn.epfl.ch/trac/scala/ticket/2102
Andere Tipps
Soweit ich weiß, Enumeration in Scala 2.7.x hat eine „Elemente“ Methode und Scala 2.8.0 hat ein „Iterator“ -Methode einen Iterator returing. Warum sie nicht benutzen?
Oh, egal, egal. Java Aufzählung.