2012-07-26 144 views
9

看看JavaConversionsJavaConverters中的代碼,我不確定在Java和Scala收集(在任何方向)之間轉換的「正確」方式(以2.10)是。Java <->斯卡拉收集轉換,斯卡拉2.10

似乎有很多@deprecated註釋。

已經從Scala Team(Typesafe?)發佈了一個明確的答案嗎?

感謝, 約翰

+0

請參閱http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k 2012-07-26 22:57:07

回答

13

我不知道任何這樣的宣佈,但你應該總是使用JavaConverters,即需要您指示與.asScala.asJava轉換的人。

據我所知,JavaConverters是在2.8.1中引入的,因爲2.8中的JavaConversions是危險的,並且很容易將意外轉換成你不期望的東西。

6

以不同的方式的兩部作品:

  • 隨着JavaConverters你的對象將被拉皮條成一類支持asScala和asJava,讓您以編程方式轉換您的收藏。

  • 隨着JavaConversions,一個Java/Scala的集合將自動要求

與後者的風險是獲得錯誤的或不必要的轉換付出了性能 故障時轉換。另外,至少在Scala 2.9中沒有隱式轉換的緩存,即如果在方法內部應用兩次相同的轉換,轉換代碼將被調用兩次。

當您明確地轉換集合時,如果您在「Java」版本中需要它,您將避免以相同方法調用兩次.asScala。

16

這對於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 

而不是發出錯誤類型,編譯器斯卡拉Map轉換爲一個java.util.Map,其具有接受Object更寬鬆的簽名。