【发布时间】:2018-05-01 02:57:43
【问题描述】:
我想构建一个消息队列消费者,它目前只有一个 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 扩展这个 trait 并尝试实现 consume
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。
【问题讨论】:
-
能否附上编译器错误
-
在你的代码中你扩展
MessagingQueueConsumer,而你的特征是Consumer -
MessagingQueueConsumer 在哪里,该特征的结构是什么
-
@NoamShaish 我已经更新了问题,并定义了特征 MessagingQueueConsumer 的结构
标签: scala apache-kafka scala-generics