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

查看:116
本文介绍了Scala 集合: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] 中的 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] - Map[String, String]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆