首页 > 解决方案 > 如何将 Scala Map 转换为 Java Map

问题描述

我正在尝试从 2 个 Java 类创建 Scala 映射:

TopicPartition (java.lang.String topic, int partition)
OffsetAndMetadata (long offset)

这看起来正确吗?

val topicPartition = new TopicPartition("sometopicname", 99)
val offsetAndMetadata = new OffsetAndMetadata(999999L,"tette")

val mapTopicOffset = Map(topicPartition -> offsetAndMetadata)

还需要创建一个将接受此地图作为输入参数的方法。

尝试过类似的东西:

  def commitSync(offsets: Map[TopicPartition, OffsetAndMetadata] ) = {

    }

得到错误:

Error:(239, 37) type mismatch;
 found   : Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata] (in scala.collection.immutable) 
 required: Map[org.apache.kafka.common.TopicPartition,org.apache.kafka.clients.consumer.OffsetAndMetadata] (in java.util) 
    verify(kc, times(1)).commitSync(mapTopicOffset)

有没有办法提供将采用 scala 映射的重载方法?(不知道怎么写)

或者也许一切都应该以不同的方式重写(从创建对象等开始)?

标签: javascala

解决方案


由于各种原因,Scala 拥有自己的标准库,包括自己的集合库,其中包含许多与 Java 中的名称相似甚至完全相同的数据结构。不幸的是,您没有提供最小、完整和可验证的示例,因此我们必须猜测修复它的正确方法到底是什么。

  1. 如果代码的双方实际上都是 Scala,只需声明commitSync使用scala.collection.immutable.Map. 如果导入中存在冲突,您可以使用包的全名或将其中一个重命名为Map明确的名称(例如JMap和/或SMap),如此处所示

  2. 如果这是关于 Scala 和 Java 代码之间通信的问题,那么 Scala 为这两种转换提供了包装器和转换器,例如 scala.collection.JavaConvertersscala.collection.JavaConversions(在 Scala 2.12 中已弃用,取而代之的是第一个)。


推荐阅读