Преобразование перечисления в итератор - PullRequest
5 голосов
/ 28 июня 2009

У меня есть следующее неявное преобразование для 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()
     }
   }

К сожалению, он не работает для ZipFile.entries, потому что он возвращает Enumeration<? extends ZipEntry> (см. связанный вопрос ), а Скалак постоянно говорит мне

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

Я не могу понять, как заставить разговор работать на чем-то другом. как

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

Ответы [ 2 ]

7 голосов
/ 28 июня 2009

List.fromIterator ожидает scala.Iterator, но ваш неявный возвращает java.util.Iterator.

Это работает

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)

Добавление одного импорта сверху предотвращает компиляцию

import java.util.Iterator

Было обсуждено объединение Scala и Java в 2.8 с помощью java.util.Iterator. С другой стороны, в итераторе Java есть метод remove, который не имеет смысла для неизменных коллекций Scala. UnsupportedOperationException? Blech! С другой стороны, такие вещи, как эта ошибка, исчезают.

Редактировать: я добавил проблему Trac, что сообщение об ошибке было бы более ясным, если бы он сказал "required: scala.Iterator [?]" https://lampsvn.epfl.ch/trac/scala/ticket/2102

1 голос
/ 29 июня 2009

Насколько я знаю, в Enumeration в Scala 2.7.x есть метод "elements", а в Scala 2.8.0 - метод "iterator", возвращающий Iterator. Почему бы не использовать их?

О, неважно, неважно. Перечисление в Java.

...