将枚举转换为迭代器

5
我有以下针对 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>(参见相关问题),而Scalac一直告诉我

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

我无法弄清楚如何在类似于sth的对话中使其工作。

List.fromIterator(new ZipFile(z).entries))
2个回答

7

List.fromIterator需要一个scala.Iterator,但是您的implicit返回了一个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可以防止编译错误

import java.util.Iterator

关于在2.8中通过仅使用java.util.Iterator来统一Scala和Java的讨论已有一些。不足之处在于,Java的Iterator具有一个对于Scala的不可变集合没有意义的remove方法。UnsupportedOperationException?太差了!好处在于这样的东西就可以消失。

编辑:我添加了一个Trac问题,如果它说“需要:scala.Iterator [?]”,那么错误消息会更清晰。https://lampsvn.epfl.ch/trac/scala/ticket/2102


1
据我所知,Scala 2.7.x 中的枚举类型有一个 "elements" 方法,而 Scala 2.8.0 则有一个返回 Iterator 的 "iterator" 方法。为什么不使用它们呢?
哦,没事了,没事了。是在说 Java 的枚举类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接