[英]Scala collections: util.Map[String, AnyRef] - Map[String, String]
我開始使用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
之前安全地進行類型asJava
:
val params: Map[String, AnyRef] = message.headers
...
.headers(params.asJava)
PS你剛剛做了之后的第二誤差的原因asJava
不斯卡拉或JavaConvertors相關,它只是V
在java.util.Map[K,V]
是不是協變(這是不變的,不像在Scala的Map[K, +V]
)。 實際上,編譯器消息對此進行了解釋:
注意:字符串<:AnyRef,但是Java定義的特征圖在類型V中是不變的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.