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を参照)を返し、Scalacが私に言い続けているため、機能しません。Enumeration<? extends ZipEntry>

type mismatch; found : java.util.Iterator[?0] 
   where type ?0 <: java.util.zip.ZipEntry 
   required: Iterator[?]

sthで会話を機能させる方法がわかりません。お気に入り

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)

上部にインポートを1つ追加すると、コンパイルが妨げられます

import java.util.Iterator

java.util.Iteratorを使用するだけで、2.8でScalaとJavaを統合することについていくつかの議論がありました。欠点として、JavaのIteratorには、Scalaの不変のコレクションには意味のないremoveメソッドがあります。UnsupportedOperationException?Blech!プラス面では、このエラーのようなものがなくなります。

編集:「必須:scala.Iterator [?]」と表示されていればエラーメッセージがより明確になるというTracの問題を追加しましたhttps://lampsvn.epfl.ch/trac/scala/ticket/2102

于 2009-06-28T14:13:03.673 に答える
1

私の知る限り、Scala 2.7.xの列挙には「elements」メソッドがあり、Scala2.8.0にはイテレーターを再実行する「iterator」メソッドがあります。使ってみませんか?

ああ、気にしないで、気にしないで。Javaの列挙。

于 2009-06-29T16:15:42.840 に答える