1

次のメソッドで Java レガシー コードを使用する必要があります。

public void doit(Map <String, Object> vals) {...}

私のScalaコード:

var map = new java.util.HashMap[String, Any]
map += "testme" -> 'X'
doit(map)

利回り =>

型の不一致; 見つかった: java.util.HashMap[String, Any] 必須: java.util.HashMap[java.lang.String, java.Object]

だから私はそれを次のように変更します:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'
doit(map)

利回り =>

型の不一致; found : Char 必須: java.lang.Object 注: プリミティブ型は暗黙的に AnyRef に変換されません。x.asInstanceOf[AnyRef] をキャストすることで安全にボクシングを強制できます。

それで、最終的に私は次のことを思いつきました:

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'.asInstanceOf[AnyRef]
doit(map)

これに対処するためのより簡潔な方法はありますか?

4

3 に答える 3

8

短くする組み込みメソッドはありませんが、ヘルパー メソッドを記述できます。

def jkv(s: String, a: Any) = s -> a.asInstanceOf[AnyRef]

map += jkv("testme",'X')

または pimp-my-library パターンを使用して、これを行う新しいオペレーターを追加します

class StringArrow(s: String) {
  def ~>(a: Any) = s -> a.asInstanceOf[AnyRef]
}
implicit def string_has_arrow(s: String) = new StringArrow(s)

map += "testme" ~> 'X'
于 2011-02-02T14:54:57.303 に答える
2

次のようにタイプの割り当てを使用します。

import java.lang.Character

var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> ('X':Character)
doit(map)

これは、まだ変換されていない場合に'X'暗黙的に変換することを Scala に伝えます。java.lang.Character( よりも具体的な型を指定しているため機能しますObject)

于 2011-02-02T15:05:58.177 に答える
1
  1. からの暗黙的な変換を使用できるかもしれませんscala.collection.JavaConversions._java.util.HashMap

  2. コンテキストはわかりませんが、"testme" -> "X"(文字列で)使用できるかもしれません

于 2011-02-02T14:54:13.647 に答える