Conversione dell'enumerazione in Iteratore
-
20-08-2019 - |
Domanda
Ho la seguente conversione implicita per 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()
}
}
Sfortunatamente non funziona per ZipFile.entries
perché restituisce un Enumeration<? extends ZipEntry>
(vedi domanda correlata ) e Scalac continua a dirmelo
type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
Non riesco a capire come far funzionare la conversazione in STH. come
List.fromIterator(new ZipFile(z).entries))
Soluzione
List.fromIterator prevede uno scala.Iterator ma il tuo implicito sta restituendo un java.util.Iterator.
Funziona
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'aggiunta di un'importazione nella parte superiore impedisce la compilazione
import java.util.Iterator
C'è stata qualche discussione sull'unificazione di Scala e Java in 2.8 semplicemente usando java.util.Iterator. Il rovescio della medaglia, Iterator di Java ha un metodo di rimozione che non ha senso per le collezioni immutabili di Scala. UnsupportedOperationException? Blech! Il lato positivo che fa scomparire cose come questo errore.
Modifica: ho aggiunto un problema di Trac secondo cui il messaggio di errore sarebbe stato più chiaro se avesse detto " richiesto: scala.Iterator [?] " https://lampsvn.epfl.ch/trac/scala/ticket/2102
Altri suggerimenti
Per quanto ne so, l'Enumerazione in Scala 2.7.x ha un " elementi " metodo e Scala 2.8.0 ha un " iteratore " metodo di ritenzione di un iteratore. Perché non usarli?
Oh, non importa, non importa. enumerazione di Java.