【问题标题】:Scala Ambiguous reference with same signature and argument types具有相同签名和参数类型的 Scala 模糊引用
【发布时间】:2019-09-11 11:10:34
【问题描述】:

Scala 如何显示一个模棱两可的引用错误,其中两个替代方案具有相同的签名?如何克服它?

代码:

import org.apache.kafka.streams.test

val stringSerializer = new StringSerializer
val stringFactory: ConsumerRecordFactory[String, String] =
    new ConsumerRecordFactory[String, String](
      eventTopic, stringSerializer, stringSerializer)
val testKey : String = ""
val testVal : String = ""
val recordString : ConsumerRecord[Array[Byte], Array[Byte]] = 
    stringFactory.create(testKey, testVal)

ambiguous reference to overloaded definition,
[error] both method create in class ConsumerRecordFactory of type (x$1: String, x$2: String)org.apache.kafka.clients.consumer.ConsumerRecord[Array[Byte],Array[Byte]]
[error] and  method create in class ConsumerRecordFactory of type (x$1: String, x$2: String)org.apache.kafka.clients.consumer.ConsumerRecord[Array[Byte],Array[Byte]]
[error] match argument types (String,String) and expected result type org.apache.kafka.clients.consumer.ConsumerRecord[Array[Byte],Array[Byte]]
[error]     val recordString : ConsumerRecord[Array[Byte], Array[Byte]] = stringFactory.create(testKey, testVal)

如您所见,这两种方法具有相同的签名。使用其他类型的 CustomerFactory 时不会发生这种情况,即我为其具有自定义序列化程序的自定义案例类类型(而不是提供的 StringSerializer)。

【问题讨论】:

    标签: scala apache-kafka apache-kafka-streams scala-java-interop


    【解决方案1】:

    为了解决方法不明确的问题,您应该遵循以下方法。

    1. 使用 KeySerializer 和 ValueSerializer 创建 ConsumerRecordFactory 实例

    2. 在 ConsumerRecord 中传递主题,后跟 Key 和 value。

    例子:

    val stringSerializer = new StringSerializer
    val stringFactory: ConsumerRecordFactory[String, String] =
        new ConsumerRecordFactory[String, String](
          stringSerializer, stringSerializer)
    val testKey : String = ""
    val testVal : String = ""
    val recordString : ConsumerRecord[Array[Byte], Array[Byte]] = 
        stringFactory.create(eventTopic, testKey, testVal)
    

    另一种选择是将键和值作为字节数组传递。

    val stringFactory: ConsumerRecordFactory[String, String] =
        new ConsumerRecordFactory[String, String](
          eventTopic, stringSerializer, stringSerializer)
    val testKey : String = ""
    val testVal : String = ""
    val recordString : ConsumerRecord[Array[Byte], Array[Byte]] = 
        stringFactory.create(testKey.getBytes, testVal.getBytes)
    

    【讨论】:

      【解决方案2】:

      我找到了解决方案。

      因此,在 ConsumerFactory 类中,有一个方法 create(final K key, final V value) 和另一个 create(final String topicName, final V value)。 由于第一个 K 可以通过 String 匹配,所以它是一个模棱两可的引用。但是,由于错误中显示的不是方法签名中的原始类型,而是 有效 类型,因此该消息有些混乱。 这是此 API 的特殊性,而不是 Scala 或 Scala-Java 互操作性。

      在这种情况下,我的解决方案是将键和值作为 ByteArray 提供,这是 Kafka 用作源类型的最终类型:

      val byteArraySerializer = new ByteArraySerializer
      val stringFactory: ConsumerRecordFactory[Array[Byte], Array[Byte]] =
          new ConsumerRecordFactory[Array[Byte], Array[Byte]](
            eventTopic, byteArraySerializer, byteArraySerializer)
      val recordString : ConsumerRecord[Array[Byte], Array[Byte]] = 
          stringFactory.create(testKey.getBytes, testVal.getBytes)
      

      @nishu-tayal 提供的解决方案也有效,但它强制您每次都指定主题。我想这里的品味问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-27
        • 2018-10-06
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多