Convertendo enumeração para Iterator
-
20-08-2019 - |
Pergunta
Eu tenho a seguinte conversão implícita para 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()
}
}
Infelizmente ele não funciona para ZipFile.entries
porque ele retorna um Enumeration<? extends ZipEntry>
(ver relacionados pergunta ) e scalac continua me dizendo
type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
Eu não consigo descobrir como fazer o trabalho conversa em algo. como
List.fromIterator(new ZipFile(z).entries))
Solução
List.fromIterator espera um scala.Iterator mas seu implícita está retornando um java.util.Iterator.
Isso funciona
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)
Adicionando uma importação ao topo impede a compilação
import java.util.Iterator
Tem havido alguma discussão sobre a unificação Scala e Java em 2,8 usando apenas java.util.Iterator. Em contrapartida, Iterator do Java tem um método remove que não faz sentido para coleções imutáveis ??do Scala. UnsupportedOperationException? Blech! No lado positivo que faz coisas como esta erro ir embora.
Edit: Eu adicionei uma questão Trac que a mensagem de erro teria sido mais claro se dissesse "necessária: [?] Scala.Iterator" https://lampsvn.epfl.ch/trac/scala/ticket/2102
Outras dicas
Tanto quanto eu sei, a enumeração no Scala 2.7.x tem um método "elementos" e Scala 2.8.0 tem uma "iteração" método returing um Iterator. Por que não usá-los?
Oh, não importa, não importa. do Java enumeração.