Как преобразовать карту Scala в карту Java - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать карту Scala из 2 классов Java:

TopicPartition (java.lang.String topic, int section)
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)

Есть ли способ предоставить перегруженный метод, который будет принимать карту скалы? (не уверен, как это написать)

Или, может быть, все должно быть переписано иначе (от начала создания объектов и т. Д.)?

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Я пытался передать Map[String, Double] методу Java. Но проблема была в том, что JavaConversions преобразует Map в java Map, но оставляет scala Double как есть, вместо того, чтобы конвертировать его в java.lang.Double. После нескольких часов поиска я нашел [ответ Альваро Карраско]) https://stackoverflow.com/a/40683561/1612432), это так же просто, как сделать:

val scalaMap = // Some Map[String, Double]
val javaMap = scalaMap.mapValues(Double.box)

После этого javaMap является Map[String, java.lang.Double]. Затем вы можете передать это java-функции, которая ожидает Map<String, Double>, и благодаря неявным преобразованиям карта Scala будет преобразована в java.util.Map

0 голосов
/ 03 мая 2018

По разным причинам Scala имеет собственную стандартную библиотеку, в том числе собственную библиотеку коллекций со многими из тех же структур данных с похожими или даже точно такими же именами, что и в Java. К сожалению, вы не предоставили Minimal, Complete и Verifiable пример , поэтому мы должны угадать, как именно это исправить.

  1. Если обе стороны кода на самом деле являются Scala, просто объявите commitSync для использования scala.collection.immutable.Map. Если в импорте есть конфликт, вы можете использовать полное имя с пакетом или переименовать одно из Map в однозначное имя (такое как JMap и / или SMap) как , показанное здесь .

  2. Если это вопрос о связи между Scala и Java-кодом, то Scala предоставляет оболочки и конвертеры для обоих преобразований, такие как scala.collection.JavaConverters или scala.collection.JavaConversions (что устарело в Scala 2.12 в пользу первого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...