2009-06-28 20 views
5

Mam następujące niejawna konwersja do java.util.EnumerationsKonwersja Wyliczanie do iterator

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() 
    } 
    } 

Niestety to nie działa dla ZipFile.entries ponieważ zwraca Enumeration<? extends ZipEntry> (patrz related question) i Scalac powtarza mi

type mismatch; found : java.util.Iterator[?0] 
    where type ?0 <: java.util.zip.ZipEntry 
    required: Iterator[?] 

Nie wiem, jak sprawić, żeby rozmowa działała w czymś. jak

List.fromIterator(new ZipFile(z).entries)) 

Odpowiedz

7

List.fromIterator oczekuje scala.Iterator ale jawnej jest zwrócenie java.util.Iterator.

Działa

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) 

Dodanie jednego import na górze zapobiega kompilacji

import java.util.Iterator 

Nie było trochę dyskusji o unifikacji Scala i Java w 2,8 używając tylko java.util.Iterator. Z drugiej strony, Java Iterator ma metodę usuwania, która nie ma sensu dla niezmiennych kolekcji Scali. UnsupportedOperationException? Blech! Na plusie, który sprawia, że ​​rzeczy takie jak ten błąd znikają.

Edit: dodałem Trac problem, że komunikat o błędzie byłby wyraźniejszy gdyby powiedział „wymagane: [?] Scala.Iterator” https://lampsvn.epfl.ch/trac/scala/ticket/2102

+0

ah błąd początkującego ;-) dzięki. –

1

O ile mi wiadomo, Wyliczanie w Scala 2.7. x ma metodę "elementów", a Scala 2.8.0 ma metodę "iteratora" przechwytującą Iterator. Dlaczego ich nie używać?

Och, nieważne, nieważne. Wyliczenie Java.