Convertir la enumeración a iterador
-
20-08-2019 - |
Pregunta
Tengo la siguiente conversión 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()
}
}
Desafortunadamente no funciona para ZipFile.entries
porque devuelve un Enumeration<? extends ZipEntry>
(vea pregunta relacionada ) y Scalac sigue diciéndome
type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
No puedo entender cómo hacer que la conversación funcione en algo. me gusta
List.fromIterator(new ZipFile(z).entries))
Solución
List.fromIterator espera un scala.Iterator pero su implícito devuelve un java.util.Iterator.
Esto 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)
Agregar una importación en la parte superior evita la compilación
import java.util.Iterator
Ha habido una discusión sobre la unificación de Scala y Java en 2.8 simplemente usando java.util.Iterator. En el lado negativo, el Iterator de Java tiene un método de eliminación que no tiene sentido para las colecciones inmutables de Scala. UnsupportedOperationException? Blech! En el lado positivo que hace que cosas como este error desaparezcan.
Editar: agregué un problema de Trac en el que el mensaje de error habría sido más claro si hubiera dicho " required: scala.Iterator [?] " https://lampsvn.epfl.ch/trac/scala/ticket/2102
Otros consejos
Hasta donde yo sé, la enumeración en Scala 2.7.x tiene un " elementos " y Scala 2.8.0 tiene un " iterator " método returing un iterador. ¿Por qué no usarlos?
Oh, no importa, no importa. enumeración de Java .