generics - 将枚举转换为迭代器

标签 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))

最佳答案

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/

相关文章:

Java使用多个表迭代HQL结果

java - 如何用java中的接口(interface)覆盖方法

C++ 输出运算符重载

c++ - 映射和迭代器(in)验证

scala - 使用哪个scala可变列表?

postgresql - 如何在spark中使用连接池来postgresql

python - 如何在C++中创建一个可迭代的类?

c# - 在 C# 中,您可以在 "where"接口(interface)约束中放置一个 Or 吗?

generics - 为什么我不能用 let _ : Arc<dyn Trait> = value. into() 创建一个 trait 对象?

scala - 为什么以及何时需要在方法名称后面加上 _?