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

我不知道如何使对话以某种方式进行。喜欢

List.fromIterator(new ZipFile(z).entries))
4

2 回答 2

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

关于在 2.8 中通过使用 java.util.Iterator 来统一 Scala 和 Java 的一些讨论。不利的一面是,Java 的 Iterator 有一个 remove 方法,这对 Scala 的不可变集合毫无意义。不支持的操作异常?布莱赫!从好的方面来说,这样的错误就会消失。

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

于 2009-06-28T14:13:03.673 回答
1

据我所知,Scala 2.7.x 中的枚举有一个“元素”方法,而 Scala 2.8.0 有一个返回迭代器的“迭代器”方法。为什么不使用它们?

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

于 2009-06-29T16:15:42.840 回答