Scala Generics с реализацией трейта -

Я хочу создать потребителя очереди сообщений, который на данный момент будет иметь только одну реализацию для Kafka, но позже он может иметь и другие реализации.

trait MessagingQueueConsumer {

  def consume[B <: NotificationConsumerRecords](topic: String, userNames: List[String]): TrieMap[String, B]

}

Здесь NotificationConsumerRecords - это абстрактный класс для записей, которые я получаю из очереди сообщений.

sealed abstract class NotificationConsumerRecords

и класс case, расширяющий его.

case class KafkaConsumerRecords[K,V](records: List[ConsumerRecord[K,V]]) extends NotificationConsumerRecords

А метод consumer должен иметь возможность принимать все подтипы NotificationConsumerRecords, поэтому существует take [B ‹: NotificationConsumerRecords]

Теперь, когда я расширяю эту черту для Kafka и пытаюсь реализовать потреблять

class KafkaMessagingQueueConsumer extends MessagingQueueConsumer {

  override def consume[KafkaConsumerRecords](topic: String, userNames: List[String]): TrieMap[String, KafkaConsumerRecords[String, String]] = {}
}

Or

class KafkaMessagingQueueConsumer extends MessagingQueueConsumer {

  override def consume[KafkaConsumerRecords[String, String]](topic: String, userNames: List[String]): TrieMap[String, KafkaConsumerRecords[String, String]] = {}
}

В обоих случаях я получаю ошибку времени компиляции. и я думаю, я понимаю, что проблема здесь в том, что компилятор принимает их как некоторый общий тип, а не как конкретный тип.

Но я не знаю, что мне делать, чтобы сообщить компилятору, что этот KafkaMessagingQueueConsumer должен принимать только KafkaConsumerRecords.


person S.K    schedule 30.04.2018    source источник
comment
Не могли бы вы прикрепить ошибку компилятора   -  person Noam Shaish    schedule 30.04.2018
comment
И в вашем коде вы расширяете MessagingQueueConsumer, пока ваша черта Consumer   -  person Noam Shaish    schedule 30.04.2018
comment
Где MessagingQueueConsumer, какова структура этой черты   -  person Raman Mishra    schedule 30.04.2018
comment
@NoamShaish Я обновил вопрос и определил структуру трейта MessagingQueueConsumer   -  person S.K    schedule 30.04.2018


Ответы (1)


Вы добавили параметр типа в метод, но хотите, чтобы параметр имел свойство.

Попробуйте вместо этого:

// Consumer for "B".
trait MessagingQueueConsumer[B <: NotificationConsumerRecords] {
  def consume(topic: String, userNames: List[String]): TrieMap[String, B]
}

И при реализации:

class KafkaMessagingQueueConsumer
    extends MessagingQueueConsumer[KafkaConsumerRecords] {
  override def consume(
      topic: String,
      userNames: List[String]
  ): TrieMap[String, KafkaConsumerRecords[String, String]] = {}
}
person jkinkead    schedule 30.04.2018