看看JavaConversions
和JavaConverters
中的代碼,我不確定在Java和Scala收集(在任何方向)之間轉換的「正確」方式(以2.10)是。Java <->斯卡拉收集轉換,斯卡拉2.10
似乎有很多@deprecated註釋。
已經從Scala Team(Typesafe?)發佈了一個明確的答案嗎?
感謝, 約翰
看看JavaConversions
和JavaConverters
中的代碼,我不確定在Java和Scala收集(在任何方向)之間轉換的「正確」方式(以2.10)是。Java <->斯卡拉收集轉換,斯卡拉2.10
似乎有很多@deprecated註釋。
已經從Scala Team(Typesafe?)發佈了一個明確的答案嗎?
感謝, 約翰
我不知道任何這樣的宣佈,但你應該總是使用JavaConverters
,即需要您指示與.asScala
和.asJava
轉換的人。
據我所知,JavaConverters
是在2.8.1中引入的,因爲2.8中的JavaConversions
是危險的,並且很容易將意外轉換成你不期望的東西。
以不同的方式的兩部作品:
隨着JavaConverters你的對象將被拉皮條成一類支持asScala和asJava,讓您以編程方式轉換您的收藏。
隨着JavaConversions,一個Java/Scala的集合將自動要求
與後者的風險是獲得錯誤的或不必要的轉換付出了性能 故障時轉換。另外,至少在Scala 2.9中沒有隱式轉換的緩存,即如果在方法內部應用兩次相同的轉換,轉換代碼將被調用兩次。
當您明確地轉換集合時,如果您在「Java」版本中需要它,您將避免以相同方法調用兩次.asScala。
這對於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
更寬鬆的簽名。
請參閱http://stackoverflow.com/questions/8301947/what-is-the-difference-between-javaconverters-and-javaconversions-in-scala – jond3k 2012-07-26 22:57:07