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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top