【问题标题】:Scala Generics with trait implementation -具有特征实现的 Scala 泛型 -
【发布时间】: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


【解决方案1】:

您已将类型参数添加到方法中,但您希望在 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]] = {}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多