我正在尝试从2个Java类创建Scala映射:
TopicPartition(java.lang.String主题,int分区)
OffsetAndMetadata(长偏移)
这看起来是否正确?
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地图的重载方法? (不知道怎么写)
或者也许所有内容都应该以不同的方式重写(从创建对象等开始)?
答案 0 :(得分:1)
由于各种原因,Scala有自己的标准库,包括自己的集合库,其中包含许多相同的数据结构,这些数据结构与Java中的名称相似甚至完全相同。很遗憾你没有提供Minimal, Complete, and Verifiable example所以我们必须猜测究竟是什么方法来解决它。
如果代码的两边实际上是Scala,只需声明commitSync
即可使用scala.collection.immutable.Map
。如果导入存在冲突,您可以在包中使用全名,也可以将其中一个Map
重命名为明确的名称(例如JMap
和/或SMap
){ {3}}
如果这是关于Scala和Java代码之间的通信的问题,那么Scala为转换提供包装器和转换器,例如shown here或scala.collection.JavaConverters(在Scala 2.12中不赞成使用第一个)。
答案 1 :(得分:0)
我试图将Map[String, Double]
传递给Java方法。但是问题是JavaConversions
将Map
转换为Java Map
,但是将标量Double
保留不变,而不是将其转换为java.lang.Double
。经过数小时的搜索,我发现[Alvaro Carrasco的答案])https://stackoverflow.com/a/40683561/1612432)就像这样简单:
val scalaMap = // Some Map[String, Double]
val javaMap = scalaMap.mapValues(Double.box)
此后,javaMap
是Map[String, java.lang.Double]
。然后,您可以将其传递给期望Map<String, Double>
的java函数,并且由于隐式转换,Scala Map将被转换为java.util.Map