将枚举转换为迭代器

时间:2009-06-28 09:05:24

标签: generics scala iterator enumeration type-inference

我对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))

2 个答案:

答案 0 :(得分:7)

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

通过使用java.util.Iterator进行了一些关于在2.8中统一Scala和Java的讨论。在缺点方面,Java的Iterator有一个删除方法,这对Scala的不可变集合没有任何意义。 UnsupportedOperationException异常?布莱什!在这方面做出错误的好处就会消失。

编辑:我添加了一个Trac问题,如果它说“必需:scala.Iterator [?]”https://lampsvn.epfl.ch/trac/scala/ticket/2102

,则错误消息会更清晰

答案 1 :(得分:1)

据我所知,Scala 2.7.x中的Enumeration有一个“elements”方法,而Scala 2.8.0有一个“iterator”方法可以在迭代器中进行迭代。为什么不使用它们?

哦,没关系,没关系。 Java的枚举。