2013-07-03 24 views
7

Próbowałem przekonwertować listę Java na listę Scala bez powodzenia przy użyciu asInstanceOf, ponieważ moja zwrócona lista z wywołania Android jest listą java.Jak mogę użyć listy Java z foreach Scala?

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

chcesz to zrobić tak, że mogę korzystać z nowego (Scala) Lista w sposób dla zrozumienia, jak to wydaje się nie podoba na podstawie listy java w tym konstrukcie, dając mi błąd.

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

Czy jest to sposób na użycie listy Java w for/foreach, bez wymuszania jej? A jeśli muszę przymuszać, jak? asInstanceOf wywołuje błąd r/t, gdy jest używany w ten sposób.

+0

Świetne pytanie. Zastanawiam się, dlaczego moje rozumienia nie działają (poszczególnych wpisów nie można wyodrębnić z właściwym typem, nawet jeśli lista zawierała generyczne). –

Odpowiedz

17

Istnieje zestaw konwersji w ramach pakietów scala.collection.JavaConversions i scala.collection.JavaConverters. Pierwszy z nich działa niejawnie przy zbieraniu, ostatni ma być jawnie użyty (pobieramy kolekcję java i przekształcamy ją w analog scala z metodą .asScala i na odwrót z .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 

A nawiasem mówiąc, powodem asInstanceOf nie działa dlatego scala i kolekcje Java mieć zupełnie inna klasa hierarchia i obsada nie może być wykonana. Lista Scala nie ma żadnych innych podobieństw z listą Javy z wyjątkiem jednego wspólnego poprzednika: klasy Object, więc nie różni się od próby obsłużenia Listy do, powiedzmy, java.util.Random.