我对 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>
(见 related question )Scalac 一直告诉我type mismatch; found : java.util.Iterator[?0]
where type ?0 <: java.util.zip.ZipEntry
required: Iterator[?]
我不知道如何使谈话在某事上起作用。喜欢
List.fromIterator(new ZipFile(z).entries))
最佳答案
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
有一些关于在 2.8 中通过使用 java.util.Iterator 来统一 Scala 和 Java 的讨论。不利的一面是,Java 的 Iterator 有一个 remove 方法,这对 Scala 的不可变集合毫无意义。不支持的操作异常?布莱克!从好的方面来说,使这种错误之类的东西消失。
编辑:我添加了一个 Trac 问题,如果它说“需要:scala.Iterator[?]”https://lampsvn.epfl.ch/trac/scala/ticket/2102,错误信息会更清楚。
关于generics - 将枚举转换为迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054571/