Преобразование перечисления в Итератор
-
20-08-2019 - |
Вопрос
У меня есть следующее неявное преобразование для 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[?]
Я не могу понять, как заставить разговор работать в sth.Нравится
List.fromIterator(new ZipFile(z).entries))
Решение
List.fromIterator ожидает scala.Итератор, но ваш неявный возвращает java.util.Итератор.
Это работает
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.Итератор.С другой стороны, итератор Java имеет метод remove, который не имеет смысла для неизменяемых коллекций Scala.Исключение UnsupportedOperationException?Блех!С положительной стороны, это избавляет от подобных ошибок.
Редактировать:Я добавил проблему с трафиком, из-за которой сообщение об ошибке было бы более понятным, если бы в нем было написано "требуется:scala.Итератор[?]" https://lampsvn.epfl.ch/trac/scala/ticket/2102
Другие советы
Насколько я знаю, перечисление в Scala 2.7.x имеет метод "elements", а Scala 2.8.0 имеет метод "iterator", возвращающий итератор.Почему бы не использовать их?
О, не бери в голову, не бери в голову. Java-х перечисление.