我有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[?]

我无法弄清楚如何使某物谈话工作。像

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

有一直有关刚好使用了java.util.Iterator统一斯卡拉和Java 2.8中的一些讨论。不利的一面,Java的迭代器拥有remove方法,这是没有意义的Scala的不可改变的集合。 UnsupportedOperationException异常?布莱什!从有利的一面,使得这样的错误的东西走了。

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

其他提示

据我所知,枚举Scala中2.7.x具有“元素”的方法和Scala 2.8.0具有“迭代”方法returing一个Iterator。为什么不使用他们?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top