문제

나는 다음과 같은 암시 적 변환이있다 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에서 Scala와 Java를 통일하는 것에 대한 논의가있었습니다. 단점에서 Java의 반복자는 Scala의 불변 컬렉션에 적합하지 않은 제거 방법이 있습니다. UnsupportedOperationException? 블레치! 이 오류와 같은 것들이 사라지는 플러스 측면에서.

편집 : "필수 : scala.iterator [?]라고 말하면 오류 메시지가 명확 해졌다는 TRAC 문제를 추가했습니다. https://lampsvn.epfl.ch/trac/scala/ticket/2102

다른 팁

내가 아는 한, Scala 2.7.x의 열거는 "요소"방법을 가지고 있으며 Scala 2.8.0에는 반복자를 유지하는 "반복자"방법이 있습니다. 왜 그것들을 사용하지 않습니까?

오, 신경 쓰지 마세요. 신경 쓰지 마세요. Java 's 열거.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top