【发布时间】: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 符合<? extends Serializer<?>> 有界泛型:
public class KafkaProtobufSerializer<T extends Message> extends AbstractKafkaProtobufSerializer<T> implements Serializer<T> {
请告诉我,我忽略了一些愚蠢:)
【问题讨论】:
-
如果将 extends Serializer> 更改为 extends Serializer>
标签: java generics apache-kafka protocol-buffers