我开始使用 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] 中的 V,V] 不是协变的(它是不变的,与 Scala 的 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]
发布评论