イテレータに列挙の変換
-
20-08-2019 - |
質問
私は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[?]
私はSTHでの会話を動作させる方法を見つけ出すことはできません。
のような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を使用して2.8にスカラ座とJavaを統合に関するいくつかの議論が行われています。下がり気味で、Javaのイテレータは、Scalaの不変コレクションのために意味をなさないremoveメソッドを持っています。 UnsupportedOperationException?ブレッヒ!このエラーのようなものが消えます。
になり、プラス側では編集:私は、エラーメッセージが明確にされているだろうことをTracの問題は、それが言っていた追加した「必要:[?] scala.Iteratorの」<のhref = "https://lampsvn.epfl.ch/trac/スカラ/チケット/ 2102" のrel = "nofollowをnoreferrer"> https://lampsvn.epfl.ch/trac/scala/ticket/2102 の
他のヒント
私の知る限りでは、Scalaの2.7.35での列挙は、「要素」方法があり、Scalaの2.8.0は、Iteratorをreturing「イテレータ」の方法があります。なぜそれを使わないのでしょうか?
ああ、気にしない、気にしません。 のJavaのの列挙ます。