【问题标题】:Scala collections: util.Map[String, AnyRef] - Map[String, String]Scala 集合:util.Map[String, AnyRef] - Map[String, String]
【发布时间】:2017-10-10 18:34:25
【问题描述】:

我开始使用 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 显然 util.Map[String, AnyRef] 是一个 Java 集合 Map[String, String] 是一个 Scala 集合
  • @dk14 你能详细说明一下吗?我需要在哪里添加.asJava

标签: java scala sbt scala-collections


【解决方案1】:

您显然缺少.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] 不同)。实际上编译器消息解释了它:

注意:String <: anyref java trait map v>

【讨论】:

  • 现在我看到:预期类型不匹配:util.Map[String, AnyRef],实际 util.Map[String, String]
  • @Darth.Vader 这与 Scala 或转换器无关 - java 的映射在第二个参数上不是反变体,因此您必须使用 java 样式(类型转换)。基本上编译器消息建议它:“注意:String <: anyref java trait map v>
猜你喜欢
  • 2016-07-21
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多