簡體   English   中英

Scala集合:util.Map [String,AnyRef]-Map [String,String]

[英]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()

}

當我更換進口的JavaConversionsJavaConverters (或者,只是注釋掉共進口),我得到的編譯例外:

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相關,它只是Vjava.util.Map[K,V]是不是協變(這是不變的,不像在Scala的Map[K, +V] )。 實際上,編譯器消息對此進行了解釋:

注意:字符串<:AnyRef,但是Java定義的特征圖在類型V中是不變的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM