java - Scala 集合 : util. Map[String, AnyRef] - Map[String, String]

标签 java scala sbt scala-collections

我正在开始使用 Scala,并将使用 JavaConverters 替换已弃用的 JavaConversions 库。我有以下代码:

import scala.collection.JavaConversions._

new AMQP.BasicProperties.Builder()
  .contentType(message.contentType.map(_.toString).orNull)
  .contentEncoding(message.contentEncoding.orNull)
  .headers(message.headers) //<<<<--------------- I SEE THE ERROR ON THIS LINE (datatype of message.heads is Map[String, String]
  .deliveryMode(toDeliveryMode(message.mode))
  .priority(..)
  .correlationId(..)
  .replyTo(..)
  .expiration(..)
  .messageId(..)
  .timestamp(..)
  .`type`(..)
  .userId(..)
  .appId(..)
  .build()

}

当我将 JavaConversions 的导入替换为 JavaConverters (或者直接注释掉导入)时,我收到编译异常:

Type mismatch expected: util.Map[String, AnyRef], actual Map[String, String]

我错过了什么?

最佳答案

显然你缺少.asJava - 显式转换是使用JavaConverters的全部要点。 util.Map[String, AnyRef] 是一个 Java 集合,Map[String, String] 是一个 Scala 集合。你至少需要

.headers(message.headers.asJava.asInstanceOf[java.util.Map[String, AnyRef]])

或者最好在调用 asJava 之前安全地进行类型转换:

val params: Map[String, AnyRef] = message.headers
...
.headers(params.asJava)

附注在执行 asJava 后出现第二个错误的原因与 Scala 或 JavaConvertors 无关,只是 java.util.Map[K 中的 V ,V] 不是协变的(它是不变的,与 Scala 的 Map[K, +V] 不同)。实际上编译器消息对此进行了解释:

Note: String <: AnyRef, but Java-defined trait Map is invariant in type V.

关于java - Scala 集合 : util. Map[String, AnyRef] - Map[String, String],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673632/

相关文章:

java - 使用java读取subclipse存储库路径

scala - 获取两个列表的元素总和的最快方法

scala - 为什么参数处于反位置?

scala - 名称/惰性函数的重复参数

scala - 如何在发布过程中通过sbt-release推送/构建docker镜像

构建我的 Play 应用程序时未找到 Hadoop 版本

java - JPEG 编码 - DHT 段问题 -> 信息字节

java - 使用 Junit 或 Jmock 断言 java beans 数组具有唯一的属性值

java - java中 volatile 关键字的行为

scala - SBT:如何在 Scala 2.12 项目中使用 Scala 2.11 库