【问题标题】:Incompatible types: java.lang.Class<capture#1 of ?> cannot be converted to不兼容的类型:java.lang.Class<capture#1 of ?> 无法转换为
【发布时间】:2021-10-28 07:48:42
【问题描述】:

我有一个很奇怪的泛型问题,Java 报告编译错误。

背景:我正在创建自己的 Kafka 客户端包装器。我需要支持的一件事是让 lib 的用户提供他们自己的键序列化器类和值序列化器类。

假设我有:

import org.apache.kafka.common.serialization.Serializer;

// ...

private Class<? extends Serializer<?>> keySerializerClass;
private Class<? extends Serializer<?>> valueSerializerClass;

// ...

public Builder<K, V> serializeWith(Class<? extends Serializer<?>> keySerializerClass,
                                   Class<? extends Serializer<?>> valueSerializerClass)
{
    this.keySerializerClass = keySerializerClass;
    this.valueSerializerClass = valueSerializerClass;
    return this;
}

现在,在呼叫现场,如果我这样做:

import org.apache.kafka.common.serialization.StringSerializer;
import io.confluent.kafka.serializers.KafkaAvroSerializer;

// ...

builder.serializeWith(StringSerializer.class, KafkaAvroSerializer.class);

效果很好。但是,如果我尝试:

import org.apache.kafka.common.serialization.StringSerializer;
import io.confluent.kafka.serializers.protobuf.KafkaProtobufSerializer;

// ...

builder.serializeWith(StringSerializer.class, KafkaProtobufSerializer.class);

它因编译错误而尖叫:

java: incompatible types: java.lang.Class<capture#1 of ?> cannot be converted to java.lang.Class<? extends org.apache.kafka.common.serialization.Serializer<?>>

这对我来说没有任何意义。毕竟KafkaProtobufSerializer 符合&lt;? extends Serializer&lt;?&gt;&gt; 有界泛型:

public class KafkaProtobufSerializer<T extends Message> extends AbstractKafkaProtobufSerializer<T> implements Serializer<T> {

请告诉我,我忽略了一些愚蠢:)

【问题讨论】:

  • 如果将 extends Serializer> 更改为 extends Serializer>

标签: java generics apache-kafka protocol-buffers


【解决方案1】:

如果您有能力修改您的 Builder 类,您可以尝试几个选项:

public Builder<K, V> serializeWith(Class<? extends Serializer<K>> keySerializerClass,
                                   Class<? extends Serializer<V>> valueSerializerClass)
{
    this.keySerializerClass = keySerializerClass;
    this.valueSerializerClass = valueSerializerClass;
    return this;
}

或删除 ?来自序列化器:

public Builder<K, V> serializeWith(Class<? extends Serializer> keySerializerClass,
                                   Class<? extends Serializer> valueSerializerClass)
{
    this.keySerializerClass = keySerializerClass;
    this.valueSerializerClass = valueSerializerClass;
    return this;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多