Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top