具有特征实现的Scala Generics -

时间:2018-04-30 07:52:00

标签: scala apache-kafka scala-generics

我想构建一个消息传递Queue Consumer,它现在只有一个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

使用方法应该能够接受NotificationConsumerRecords的所有子类型,这就是使用[B&lt;: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。

1 个答案:

答案 0 :(得分:0)

您已将类型参数添加到方法中,但您希望参数位于特征上。

请改为尝试:

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