سؤال

ولدي التحويل الضمني التالية ل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[?]

وأنا لا يمكن معرفة كيفية جعل عمل محادثة في لك شيء. مثل

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. على الجانب السلبي، مكرر جافا لديه وسيلة إزالة التي لا معنى لمجموعات ثابتة سكالا. UnsupportedOperationException؟ BLECH! على الجانب الايجابي الذي يجعل مثل هذه الاشياء الخطأ يذهب بعيدا.

وتحرير: واضاف لقد القضية تراك أن رسالة الخطأ كان يمكن أن يكون أكثر وضوحا كان ذلك قال "المطلوبة: [؟] scala.Iterator" <لأ href = "https://lampsvn.epfl.ch/trac/ سكالا / تذكرة / 2102 "يختلط =" نوفولو noreferrer "> https://lampsvn.epfl.ch/trac/scala/ticket/2102

نصائح أخرى

وبقدر ما أعرف، التعداد في سكالا 2.7.x له "عناصر" طريقة وسكالا 2.8.0 لديه "مكرر" طريقة عودتهم مكرر. لماذا لم تستخدمها؟

وأوه، لا يهم، لا يهم. جافا التعداد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top