首页 文章

具有特征实现的Scala Generics -

提问于
浏览
1

我想构建一个消息传递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

而且consume方法应该能够接受NotificationConsumerRecords的所有子类型,这就是消耗[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]] = {}
}

我在两种情况下都遇到编译时错误 . 我想我明白这里的问题是编译器将它们作为一些泛型类型而不是特定类型 .

但是我不知道我该怎么办才能让编译器知道 this KafkaMessagingQueueConsumer should accept only KafkaConsumerRecords.

1 回答

  • 0

    您已将type参数添加到方法中,但您需要特征上的参数 .

    试试这个:

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

相关问题