在Scala中使用java迭代器

时间:2015-04-02 13:00:51

标签: java scala

我试图用Scala迭代java util.iterator但是在将对象转换为正确的类时遇到了麻烦。

我收到错误:

type mismatch; found: java.util.Iterator[?0] where type ?0 
required : java.util.iterator[net.percederberg.mibble.MibSymbol]
  val iter:util.Iterator[MibSymbol] == mib_obj.getAllSymbols.iterator()

代码如下所示:

import java.io.File
import java.util
import net.percederberg.mibble._
import scala.collection.immutable.HashMap
import scala.collection.JavaConversions._

object Bacon {
  def main(args:Array[String]) {
    println("hello")
    val mib_obj:Mib = loadMib(new File("/Users/tjones24/dev/mibs/DOCS-IF-MIB.my"))
    val iter:util.Iterator[MibSymbol] = mib_obj.getAllSymbols.iterator()
    while(iter.hasNext()) {
      var obj:MibSymbol = iter.next()
      println(obj.getName())
    }

  }
  def loadMib(file: File): Mib = {
    var loader: MibLoader = new MibLoader()
    loader.addDir(file.getParentFile())
    return loader.load(file)
  }


}

1 个答案:

答案 0 :(得分:1)

使用明确的类型转换asInstanceOf[Iterator[MibSymbol]]

  def main(args: Array[String]) {
    println("hello")
    val mib_obj: Mib = loadMib(new File("/Users/tjones24/dev/mibs/DOCS-IF-MIB.my"))
    val x = mib_obj.getAllSymbols.iterator()
    val iter: util.Iterator[MibSymbol] = x.asInstanceOf[Iterator[MibSymbol]]
    while (iter.hasNext()) {
      var obj: MibSymbol = iter.next()
      println(obj.getName())
    }
  }

  def loadMib(file: File): Mib = {
    var loader: MibLoader = new MibLoader()
    loader.addDir(file.getParentFile())
    return loader.load(file)
  }

注意:如果没有运行时类型信息,则可能会失败。

EDIT1 :您还可以使用for comprehension:

val mib_obj: Mib = loadMib(new File("/Users/tjones24/dev/mibs/DOCS-IF-MIB.my"))
for ( obj <- mib_obj.getAllSymbols) {
  println(obj.asInstanceOf[MibSymbol].getName())
}

import scala.collection.JavaConversions._为你做了所有的魔力。您只需确保类型正确。