2009-06-28 126 views
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>(见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)) 

回答

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统一斯卡拉和Java 2.8。不利的一面是,Java的Iterator有一个remove方法,这对于Scala的不可变集合是没有意义的。 UnsupportedOperationException异常?布莱什!在使这个错误这样的错误消失的好处。

编辑:我添加了一个Trac的问题,错误信息将是更清晰了它说:“要求:[?] scala.Iterator” https://lampsvn.epfl.ch/trac/scala/ticket/2102

+0

啊一个新手错误;-)谢谢。 – 2009-06-30 07:46:09

1

据我所知,枚举在斯卡拉2.7。 x有一个“元素”方法,Scala 2.8.0有一个迭代器方法来回应迭代器。为什么不使用它们?

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