使用Scala中的java.util.Map

时间:2011-02-02 14:37:12

标签: scala collections scala-collections generic-collections scala-java-interop

我需要使用以下方法使用java-legacy代码:

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

我的Scala代码:

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

yield =&gt;

类型不匹配;发现:java.util.HashMap [String,Any] required:java.util.HashMap [java.lang.String,java.Object]

所以我将其改为:

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

yield =&gt;

类型不匹配;发现: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)

有没有更简洁的方法来解决这个问题?

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:2)

使用类型归属如下:

import java.lang.Character

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

这告诉Scala您希望'X'隐式转换为java.lang.Character(如果它已经不是)。 (它的工作原理是它指定了比Object更具体的类型)

答案 2 :(得分:1)

  1. 也许您可以使用来自scala.collection.JavaConversions._的隐式转化 它将允许您scala可变或不可变的地图而不是java.util.HashMap

  2. 我不知道上下文,但也许你可以使用"testme" -> "X"(带字符串)