Frage

Ich habe die folgende implizite Konvertierung für 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()
     }
   }

Leider ist es nicht für ZipFile.entries arbeiten, weil es eine Enumeration<? extends ZipEntry> zurückgibt (siehe verwandten Frage ) und Scalac sagt mir,

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

Ich kann nicht herausfinden, wie das Gespräch Arbeit in etw. wie

List.fromIterator(new ZipFile(z).entries))
War es hilfreich?

Lösung

List.fromIterator erwartet eine scala.Iterator aber Ihre implizite ein java.util.Iterator zurück.

Das funktioniert

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)

Das Hinzufügen einer Import an der Spitze verhindert Kompilation

import java.util.Iterator

Es gab einige Diskussionen über die Vereinheitlichung Scala und Java in 2,8 von nur java.util.Iterator verwenden. Auf der anderen Seite hat die Java Iterator eine remove-Methode, die keinen Sinn für Scala unveränderlich Sammlungen macht. UnsupportedOperationException? Blech! Auf der positiven Seite das macht Sachen wie dieser Fehler weg.

Edit: Ich habe ein Problem Trac fügt hinzu, dass die Fehlermeldung klarer gewesen wäre, hatte es gesagt "erforderlich: [?] Scala.Iterator" https://lampsvn.epfl.ch/trac/scala/ticket/2102

Andere Tipps

Soweit ich weiß, Enumeration in Scala 2.7.x hat eine „Elemente“ Methode und Scala 2.8.0 hat ein „Iterator“ -Methode einen Iterator returing. Warum sie nicht benutzen?

Oh, egal, egal. Java Aufzählung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top