使用Scala中的java.util.Map

tra*_*ory 1 collections scala generic-collections scala-java-interop scala-collections

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

public void doit(Map <String, Object> vals) {...}
Run Code Online (Sandbox Code Playgroud)

我的Scala代码:

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

yield =>

类型不匹配; found: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)
Run Code Online (Sandbox Code Playgroud)

yield =>

类型不匹配; 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)
Run Code Online (Sandbox Code Playgroud)

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

Rex*_*err 8

没有内置的方法来缩短它,但你可以编写一个辅助方法:

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

map += jkv("testme",'X')
Run Code Online (Sandbox Code Playgroud)

或者使用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'
Run Code Online (Sandbox Code Playgroud)