2016-06-15 10 views
0

におけるJavaの地図を使用した:私は徹底的にScalaのREPLでこの動作によって混乱していScalaの

scala> import java.util.Map 
import java.util.Map 

scala> import java.util.HashMap 
import java.util.HashMap 

scala> val jMap:java.util.Map[String,Int]=new HashMap[String,Int]("first"->1,"second" -> 2) 

<console>:12: error: type mismatch; 
found : (String, Int) 
required: Float 
    val jMap =new HashMap[String,Int]("first"->1,"second" -> 2) 
                    ^
<console>:12: error: type mismatch; 
found : (String, Int) 
required: Float 
    val jMap=new HashMap[String,Int]("first"->1,"second" -> 2) 
                       ^

誰かがここで何が起こっているか説明するのに役立つことはできますか?あなたが必要とされているフロートについてコンパイルエラーを取得している理由です、

+0

単に 'x - > y'がタプル'(x、y) 'を作成するためです。 [Hashmap](http://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html)コンストラクタでは、Tuple2を引数として使用できません。 – archz

答えて

6

java.util.HashMap(K, V)の可変引数を渡すことで、マップを構築するための機能を提供していませんが、initialCapacity: IntloadFactor: Floatを受け入れ、二引数のコンストラクタがあります。 Scalaでは

PreferrableアプローチはちょうどScalaの不変のマップを(何の輸入は必要ありません)を使用することであろう、または、Javaの相互運用機能を使用すると、達成することが喜んでいるものであれば、単にJavaConvertersをインポートします。

import scala.collection.JavaConverters._ 

val map = Map("first" -> 1, "second" -> 2).asJava 
// map: java.util.Map[String,Int] = {first=1, second=2} 

またはJavaConversions(両方とも)は相互に排他的であるので、あなたが好きな方を選択します。

import java.util.{Map => JMap}  
import scala.collection.JavaConversions._ 

val map: JMap[String, Int] = Map("first" -> 1, "second" -> 2) 
// map: java.util.Map[String,Int] = {first=1, second=2} 

更新: @ジャスパー-Mのコメントで指摘したように、JavaConversionsはScalaの2.12のよう推奨されていませんJavaConvertersが好ましい。私の意見では、asJavaasScalaの方法は結果を達成するためのより明確な方法を提供するので、これは意味があります。

+0

これで説明します。ありがとう。 – femibyte

+1

私は 'JavaConversions'が廃止されると思います。 –

+0

Thanks @ Jasper-M、[scala sourceのfresh JavaConversions](https://github.com/scala/scala/blob/cdc011f9aefc030057575ec075f3c657c92f23de/src/library/scala/collection/JavaConversions.scala)を確認して更新しましたそれに応じて私の答え。 – Sergey

関連する問題