Scala 集合:util.Map[String, AnyRef] - Map[String, String] [英] Scala collections: util.Map[String, AnyRef] - Map[String, String]
问题描述
我开始使用 Scala,我正在用 JavaConverters
替换已弃用的 JavaConversions
库.我有以下代码:
I am getting started with Scala and I am replacing the deprecated JavaConversions
library with JavaConverters
. I have the following code:
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
(或者,完全注释掉导入)时,我得到编译异常:
When I replace the import for JavaConversions
to JavaConverters
(or, just comment out the import altogether), I get the compilation exception:
Type mismatch expected: util.Map[String, AnyRef], actual Map[String, String]
我错过了什么?
推荐答案
您显然缺少 .asJava
- 显式转换是使用 JavaConverters 的全部意义.util.Map[String, AnyRef]
是一个 Java 集合,Map[String, String]
是一个 Scala 集合.你至少需要
You're missing .asJava
obviously - explicit conversion is the whole point of using JavaConverters. util.Map[String, AnyRef]
is a Java collection, Map[String, String]
is a Scala collection. You need at least
.headers(message.headers.asJava.asInstanceOf[java.util.Map[String, AnyRef]])
或者在调用 asJava
之前安全地进行类型转换:
or better to do type-cast safely before calling asJava
:
val params: Map[String, AnyRef] = message.headers
...
.headers(params.asJava)
附言在执行 asJava
后出现第二个错误的原因与 Scala 或 JavaConvertors 无关,只是 java.util.Map[K] 中的
不是协变的(它是不变的,与 Scala 的 V
,V]Map[K, +V]
不同).实际上编译器消息解释了它:
P.S. The reason you've got a second error after just doing asJava
isn't Scala or JavaConvertors related, it's just that V
in java.util.Map[K,V]
isn't covariant (it's invariant, unlike in Scala's Map[K, +V]
). Actually compiler messages explains it:
注意:String <: AnyRef,但 Java 定义的 trait Map 在类型 V 中是不变的.
Note: String <: AnyRef, but Java-defined trait Map is invariant in type V.
这篇关于Scala 集合:util.Map[String, AnyRef] - Map[String, String]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!