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))
¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top