1

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

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

我的斯卡拉代码:

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 required: 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)

这告诉 Scala如果它还不是一个,你希望它'X'被隐式转换为。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 回答