2012-07-26 13 views
9

Patrząc na kod w JavaConversions i JavaConverters, nie jestem pewien, który "prawidłowy" sposób (z 2.10) do konwersji między kolekcjami Java i Scala (w obu kierunkach) jest.Java <-> Konwersje Scala Collection, Scala 2.10

Wygląda na to, że jest wiele adnotacji @deprecated.

Czy opublikowano ostateczną odpowiedź od zespołu Scala (Typesafe?)

Dzięki John

+0

Zobacz http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k

Odpowiedz

13

nie wiem każdego takiego głoszenia, ale należy po prostu zawsze używać JavaConverters, to znaczy te, które wymagają, aby wskazać konwersje z .asScala i .asJava.

Jak rozumiem, JavaConverters zostały wprowadzone w 2.8.1, ponieważ JavaConversions w wersji 2.8 były niebezpieczne i ułatwiały przypadkową konwersję rzeczy tam, gdzie się tego nie spodziewały.

6

Obie prace w inny sposób:

  • Z JavaConverters twoje przedmioty zostaną Pimped do klasy, które obsługują asScala i asJava, które pozwalają programowo przekonwertować swoją kolekcję.

  • Z JavaConversions, zbiór Java/Scala zostaną automatycznie zamienione podczas wymagane

Ryzyko z tym ostatnim jest uzyskanie błędnych lub niepotrzebnych konwersji płacąc wydajności usterkę. Co więcej, przynajmniej w Scali 2.9 nie ma buforowania niejawnej konwersji, tj. Jeśli ta sama konwersja jest stosowana dwukrotnie w metodzie, kod konwersji jest wywoływany dwa razy.

Po wyraźnej konwersji kolekcji, jeśli jest to potrzebne w wersji "Java", unikniesz dwukrotnego wywołania .asScala w tej samej metodzie.

16

Jest to przykład plakat dziecko do niebezpieczeństw import JavaConversions._:

scala> val m = Map(1 -> "one") 
m: scala.collection.immutable.Map[Int,String] = Map(1 -> one) 

scala> m.contains(1) 
res0: Boolean = true 

scala> m.contains("") 
<console>:9: error: type mismatch; 
found : String("") 
required: Int 
       m.contains("") 
         ^

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> m.contains("") 
res2: Boolean = false 

Zamiast wydawania typu błędu, kompilator zamienia Scala Map się do java.util.Map, która ma luźniejszą podpis, który akceptuje Object.

Powiązane problemy