2012-07-26 31 views
9

Nhìn mã trong JavaConversionsJavaConverters, tôi không chắc cách nào "đúng" (với 2,10) để chuyển đổi giữa bộ sưu tập Java và Scala (theo một trong hai hướng) là.Java <-> Chuyển đổi bộ sưu tập Scala, Scala 2.10

Dường như có nhiều chú thích @deprecated.

Câu trả lời cuối cùng từ Nhóm Scala (Typesafe?) Đã được xuất bản chưa?

Cảm ơn, John

+0

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

Trả lời

13

Tôi không biết về bất kỳ công bố như vậy, nhưng bạn nên chỉ luôn luôn sử dụng JavaConverters, ví dụ những người mà yêu cầu bạn phải chỉ ra chuyển đổi với .asScala.asJava.

Như tôi đã hiểu, JavaConverters được đưa vào trong 2.8.1 vì JavaConversions trong 2.8 là nguy hiểm và dễ dàng vô tình chuyển đổi những thứ mà bạn không mong đợi.

6

Hai tác phẩm theo một cách khác:

  • Với JavaConverters đối tượng của bạn sẽ được pimped vào một lớp học có hỗ trợ asScala và asJava, cho phép bạn lập trình chuyển đổi bộ sưu tập của bạn.

  • Với JavaConversions, một bộ sưu tập Java/Scala sẽ được tự động chuyển đổi khi cần thiết

Nguy cơ với sau này là để có được chuyển đổi sai hoặc không cần thiết phải trả một hiệu suất lỗi. Ngoài ra, ít nhất trong Scala 2.9 không có bộ nhớ đệm của chuyển đổi ngầm định, tức là nếu cùng một chuyển đổi được áp dụng hai lần bên trong một phương thức, mã chuyển đổi được gọi hai lần.

Khi bạn rõ ràng chuyển đổi bộ sưu tập, nếu bạn cần nó trong phiên bản "Java", bạn sẽ tránh gọi hai lần .asScala trong cùng một phương thức.

16

Đây là ví dụ tấm áp phích trẻ cho sự nguy hiểm của 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 

Thay vì đưa ra một lỗi gõ, trình biên dịch chuyển đổi Scala Map để đến một java.util.Map, trong đó có một chữ ký lỏng hơn chấp nhận Object.

Các vấn đề liên quan