2013-07-03 13 views
7

Ho provato a convertire una lista java in una lista Scala senza successo usando asInstanceOf, poiché la mia lista restituita da una chiamata Android è una lista java.Come posso utilizzare una lista Java con foreach di Scala?

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

desiderio di fare questo in modo che posso usare la (nuova Scala) elenco in un per la comprensione in quanto non sembra come l'utilizzo di una lista java in questo costrutto dandomi un errore.

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

È un modo di utilizzare un elenco Java in un for/foreach, senza forzarlo? E se devo costringere, come? asInstanceOf richiama un errore r/t quando viene utilizzato in questo modo.

+0

Ottima domanda. Mi chiedevo perché le mie comprensioni non funzionassero (le singole voci non potevano essere estratte con il tipo corretto anche se la lista usava i generici). –

risposta

17

C'è un insieme di conversioni sotto i pacchetti scala.collection.JavaConversions e scala.collection.JavaConverters. Il primo agisce implicitamente sulla raccolta, l'ultimo deve essere usato esplicitamente (si prende la raccolta java e la si trasforma nella scala analogica con il metodo .asScala e viceversa con .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 

E tra l'altro, la ragione asInstanceOf non funziona è perché scala e collezioni di Java hanno completamente diversa gerarchia e cast di classe non possono essere fatte. L'elenco Scala non ha altre somiglianze con l'elenco Java tranne un predecessore comune: classe Object, quindi non è diverso dal provare a eseguire il cast List, ad esempio, java.util.Random.