Scala Generics с чертой реализации - - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу построить Потребитель очереди сообщений, который пока будет иметь только одну реализацию для 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

И метод потребления должен иметь возможность принимать все подтипы NotificationConsumerRecords, поэтому существует потребление [B <: NotificationConsumerRecords] </em>

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

class KafkaMessagingQueueConsumer extends MessagingQueueConsumer {

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

Или

class KafkaMessagingQueueConsumer extends MessagingQueueConsumer {

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

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

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

1 Ответ

0 голосов
/ 30 апреля 2018

Вы добавили параметр типа в метод, но хотите, чтобы этот параметр был указан в признаке.

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

// 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]] = {}
}
...