2012-03-09 20 views
8

ブール値を持つスカラ・マップをjava.lang.Boolean値(相互運用性のため)を持つJavaマップに変換したいとします。ブール値を含むスカラ・マップからjava.lang.Booleanを含むJavaマップへの変換

import scala.collection.JavaConversions._ 

val a = Map[Int, Boolean]((1, true), (2, false)) 
val b : java.util.Map[Int, java.lang.Boolean] = a 

はで失敗します。暗黙の型変換が同じタイプにパラメータコンテナで幸せに動作しますが、ブール& java.lang.Booleanの間の変換について知らない

error: type mismatch; 
found : scala.collection.immutable.Map[Int,scala.Boolean] 
required: java.util.Map[Int,java.lang.Boolean] 
val b : java.util.Map[Int, java.lang.Boolean] = a 

JavaConversions。

JavaConversionsの魔法を使ってこの変換を行うことはできますか、そのパッケージで暗黙の変換を使わずに変換を行うための簡潔な構文はありますか?

答えて

8

JavaConversionsjava.util.MapにScalaの地図を変換し、かつますがScalaのIMPL scala.Booleanを黙ってjava.lang.Booleanに変換すると、Scalaは必要な型を取得するために2回の暗黙の変換を実行しません。

Booleanは、明示的な変換のための方法を提供します(box)。あなたのコードで頻繁にこれをやっている場合は

val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(Boolean.box) 

、あなたはすべてのMap[T, Boolean]ための独自の暗黙的な変換を定義することができます。

import scala.collection.JavaConversions._ 

implicit def boolMap2Java[T](m: Map[T, Boolean]): 
    java.util.Map[T, java.lang.Boolean] = m.mapValues(Boolean.box) 

val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

ありがとうございます。 Scalaは2つの暗黙的な変換を連鎖しますか? – flend

+1

[Programming in Scala](http://amzn.com/0981531644)によると、 "1度に1つのルール:暗黙のうちに1つだけ試行されます。" – leedm777

8

scala.collection.JavaConversionsは、scala.Booleanからjava.lang.Booleanという問題であなたを助けるつもりはありません。

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a.mapValues(boolean2Boolean) 

それとも、JavaのBoolean(boolean value)コンストラクタを使用することができます:

val a = Map[Int, Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = 
     a.mapValues(new java.lang.Boolean(_)) 

それとも、単にJavaの参照型を使用する最初のマップを宣言することができますが、以下はscala.Predefからboolean2Boolean方法を使用して、しかし、動作します:

val a = Map[Int, java.lang.Boolean](1 -> true, 2 -> false) 
val b: java.util.Map[Int, java.lang.Boolean] = a 
+0

マップを変換するには、どちらの場合でも 'asJava'がありません。 –

+1

@Joachim: 'JavaConverters'を使用している場合は' asJava'が必要です。質問と私の答えは暗黙的に変換を行う 'JavaConversions'オブジェクトを使用しています。 –

+0

ああ、JavaConversionsについて感謝していない、ありがとう。あなたはあなたのコメントの中でこれをちょうど打ちましたが、答えに名前が見つかりました。 –

関連する問題