我正在开始使用 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 中的
不是协变的(它是不变的,与 Scala 的 V
,V]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/