使用 Scala 中的 java.util.Map

发布于 2024-10-15 23:10:38 字数 816 浏览 8 评论 0原文

我需要通过以下方法使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南…巷孤猫 2024-10-22 23:10:38

没有内置方法可以使其更短,但您可以编写一个辅助方法:

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'

There's not a built in method to make it shorter, but you can write a helper method:

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

map += jkv("testme",'X')

or use the pimp-my-library pattern to add a new operator that does this for you

class StringArrow(s: String) {
  def ~>(a: Any) = s -> a.asInstanceOf[AnyRef]
}
implicit def string_has_arrow(s: String) = new StringArrow(s)

map += "testme" ~> 'X'
月下伊人醉 2024-10-22 23:10:38

按如下方式使用类型归属:

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 更具体的类型)

Use type ascription as follows:

import java.lang.Character

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

This tells Scala that you want the 'X' to be implicitly converted to java.lang.Character if it isn't one already. (It works becuase it specifies a more specific type than Object)

假装不在乎 2024-10-22 23:10:38
  1. 也许您可以使用来自 scala.collection.JavaConversions._ 的隐式转换。
    它将允许您使用 scala 可变或不可变映射来代替 java.util.HashMap

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

  1. 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

  2. I do not know the context, but maybe you could use "testme" -> "X" (with String)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文