使用 Scala 中的 java.util.Map
我需要通过以下方法使用 java 遗留代码:
public void doit(Map <String, Object> vals) {...}
我的 Scala 代码:
var map = new java.util.HashMap[String, Any]
map += "testme" -> 'X'
doit(map)
yields =>
类型不匹配;发现: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)
yields =>
类型不匹配;发现:查尔 必需:java.lang.Object 注意:原始类型不会隐式转换为 AnyRef。 您可以通过转换 x.asInstanceOf[AnyRef] 安全地强制装箱。
所以最后我想出了以下问题:
var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'.asInstanceOf[AnyRef]
doit(map)
是否有更简洁的方法来处理这个问题?
I need to use java-legacy code with the following method:
public void doit(Map <String, Object> vals) {...}
My Scala code:
var map = new java.util.HashMap[String, Any]
map += "testme" -> 'X'
doit(map)
yields =>
type mismatch; found : java.util.HashMap[String, Any]
required: java.util.HashMap[java.lang.String, java.Object]
So I change it to:
var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'
doit(map)
yields =>
type mismatch; found : Char
required: java.lang.Object
Note: primitive types are not implicitly converted to AnyRef.
You can safely force boxing by casting x.asInstanceOf[AnyRef].
So finally I came up with the following:
var map = new java.util.HashMap[java.lang.String, Object]
map += "testme" -> 'X'.asInstanceOf[AnyRef]
doit(map)
Is there is a more concise way to deal with this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
没有内置方法可以使其更短,但您可以编写一个辅助方法:
或使用 pimp-my-library 模式添加一个新运算符来为您执行此操作
There's not a built in method to make it shorter, but you can write a helper method:
or use the pimp-my-library pattern to add a new operator that does this for you
按如下方式使用类型归属:
这告诉 Scala 您希望将
'X'
隐式转换为java.lang.Character
(如果它还不是)。 (它之所以有效,是因为它指定了比Object
更具体的类型)Use type ascription as follows:
This tells Scala that you want the
'X'
to be implicitly converted tojava.lang.Character
if it isn't one already. (It works becuase it specifies a more specific type thanObject
)也许您可以使用来自 scala.collection.JavaConversions._ 的隐式转换。
它将允许您使用 scala 可变或不可变映射来代替
java.util.HashMap
我不知道上下文,但也许您可以使用
"testme" -> “X”
(带字符串)Maybe you could use come implicit conversions from
scala.collection.JavaConversions._
It will allow you to scala mutable or immutable maps instead of
java.util.HashMap
I do not know the context, but maybe you could use
"testme" -> "X"
(with String)