9

Android 呼び出しから返されたリストは Java リストであるため、asInstanceOf を使用して成功せずに Java リストを Scala リストに変換しようとしました。

val apList = (wfm.getScanResults:java.util.List[ScanResult])

これを実行して、(新しい Scala) リストを for 内包表記で使用できるようにしたいと考えています。この構造で Java リストを使用するとエラーが発生するようです。

value foreach is not a member of java.util.List[android.net.wifi.ScanResult]
    for (ap<-apList) { .... }
         ^

強制せずに for/foreach で Java リストを使用する方法はありますか? そして、私が強制しなければならない場合、どのように?このように使用すると、asInstanceOf が ar/t エラーを呼び出すためです。

4

1 に答える 1

27

scala.collection.JavaConversionsおよびパッケージの下に一連の変換がありscala.collection.JavaConvertersます。最初のものはコレクションに対して暗黙的に動作し、最後のものは明示的に使用することを意図しています (Java コレクションを取り、それをメソッドで scala アナログに変換し、.asScalaメソッドでその逆を行い.asJavaます)。

import scala.collection.JavaConversions._

scala> val xs = new java.util.ArrayList[Int]()
// xs: java.util.ArrayList[Int] = []
xs.add(1)
xs.add(2)
// java.util.ArrayList[Int] = [1, 2]

scala> for(x <- xs) println(x)
1
2

ちなみに、asInstanceOf が動かないのは、scalaと java のコレクションは階層が全然違うし、クラスのキャストができないからです。Scala のリストは、共通の前身である Object クラスを除いて、Java のリストとの類似点はありません。

于 2013-07-03T23:29:33.590 に答える