Tommie Jones
Tommie Jones

Reputation: 1011

working with java iterators in Scala

Im trying to iterate over a java util.iterator with Scala but am having trouble with casting the objects to the correct class.

I get the error:

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()

the code looks like following:

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)
  }


}

Upvotes: 1

Views: 580

Answers (1)

tuxdna
tuxdna

Reputation: 8477

Use an explicit typecast 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)
  }

NOTE: In absence of runtime type information, this may fail.

EDIT1: You can also use a 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._ does all the magic for you. You only need to ensure that the types are correct.

Upvotes: 2

Related Questions