1

我想构建一个消息队列消费者,它现在只有一个 Kafka 实现,但稍后,它也可以有其他实现。

trait MessagingQueueConsumer {

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

}

这里的 NotificationConsumerRecords 是我从消息队列中使用的记录的抽象类。

sealed abstract class NotificationConsumerRecords

和一个扩展它的案例类。

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

consume方法应该能够接受NotificationConsumerRecords的所有子类型,这就是为什么有consume[B <: NotificationConsumerRecords]

现在,当我为 Kafka 扩展这个特性并尝试实现消费时

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。

4

1 回答 1

0

您已将类型参数添加到方法中,但您希望在 trait 上添加参数。

试试这个:

// 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]] = {}
}
于 2018-04-30T18:57:43.573 回答