と のコードを見るJavaConversions
とJavaConverters
、(2.10 で) Java と Scala のコレクション間で (いずれかの方向に) 変換する「正しい」方法がどれかわかりません。
@deprecated アノテーションがたくさんあるようです。
Scala チーム (Typesafe?) からの決定的な回答は公開されていますか?
ありがとう、ジョン
と のコードを見るJavaConversions
とJavaConverters
、(2.10 で) Java と Scala のコレクション間で (いずれかの方向に) 変換する「正しい」方法がどれかわかりません。
@deprecated アノテーションがたくさんあるようです。
Scala チーム (Typesafe?) からの決定的な回答は公開されていますか?
ありがとう、ジョン
これは、次の危険性の代表的な例です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
型エラーを発行する代わりに、コンパイラは ScalaMap
を に変換java.util.Map
しますObject
。
そのような宣言は知りませんが、常に を使用する必要があります。つまり、と でJavaConverters
変換を示す必要があるものです。.asScala
.asJava
私が理解しているようにJavaConverters
、2.8.1 で導入されたのはJavaConversions
、2.8 では危険であり、予期していなかったものを誤って変換しやすくなったためです。
この 2 つは異なる方法で動作します。
JavaConverters を使用すると、オブジェクトは asScala と asJava をサポートするクラスに変換され、コレクションをプログラムで変換できます。
JavaConversions を使用すると、必要に応じて Java/Scala コレクションが自動的に変換されます
後者のリスクは、間違った、または不要な変換が行われ、パフォーマンスに問題が生じることです。さらに、少なくとも Scala 2.9 では、暗黙的な変換のキャッシュはありません。つまり、メソッド内で同じ変換が 2 回適用されると、変換コードが 2 回呼び出されます。
コレクションを明示的に変換する場合、「Java」バージョンでそれが必要な場合は、同じメソッドで .asScala を 2 回呼び出すことを避けることができます。