9

と のコードを見るJavaConversionsJavaConverters、(2.10 で) Java と Scala のコレクション間で (いずれかの方向に) 変換する「正しい」方法がどれかわかりません。

@deprecated アノテーションがたくさんあるようです。

Scala チーム (Typesafe?) からの決定的な回答は公開されていますか?

ありがとう、ジョン

4

3 に答える 3

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

型エラーを発行する代わりに、コンパイラは ScalaMapを に変換java.util.MapしますObject

于 2013-12-28T17:24:32.850 に答える
13

そのような宣言は知りませんが、常に を使用する必要があります。つまり、と でJavaConverters変換を示す必要があるものです。.asScala.asJava

私が理解しているようにJavaConverters、2.8.1 で導入されたのはJavaConversions、2.8 では危険であり、予期していなかったものを誤って変換しやすくなったためです。

于 2012-07-26T22:50:41.973 に答える
6

この 2 つは異なる方法で動作します。

  • JavaConverters を使用すると、オブジェクトは asScala と asJava をサポートするクラスに変換され、コレクションをプログラムで変換できます。

  • JavaConversions を使用すると、必要に応じて Java/Scala コレクションが自動的に変換されます

後者のリスクは、間違った、または不要な変換が行われ、パフォーマンスに問題が生じることです。さらに、少なくとも Scala 2.9 では、暗黙的な変換のキャッシュはありません。つまり、メソッド内で同じ変換が 2 回適用されると、変換コードが 2 回呼び出されます。

コレクションを明示的に変換する場合、「Java」バージョンでそれが必要な場合は、同じメソッドで .asScala を 2 回呼び出すことを避けることができます。

于 2012-07-27T15:57:20.853 に答える