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

编程入门 行业动态 更新时间:2024-10-28 00:26:16
本文介绍了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]

本文发布于:2023-07-15 18:11:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1112870.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:util   Scala   Map   AnyRef   String

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!