我需要使用以下方法使用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)
有没有更简洁的方法来解决这个问题?
答案 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)
也许您可以使用来自scala.collection.JavaConversions._
的隐式转化
它将允许您scala可变或不可变的地图而不是java.util.HashMap
我不知道上下文,但也许你可以使用"testme" -> "X"
(带字符串)