質問

私は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のの列挙ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top