メッセージング キュー コンシューマーを構築したいと考えています。現時点では、Kafka の実装は 1 つだけですが、後で他の実装も含めることができます。
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 のみを受け入れる必要があることをコンパイラに知らせるにはどうすればよいかわかりません。