![](/img/trans.png)
[英]EasyMock java: incompatible types: java.lang.ClassLoader cannot be converted to java.lang.Class<capture#1 of ? extends >
[英]Incompatible types: java.lang.Class<capture#1 of ?> cannot be converted to
我对泛型有一个相当奇怪的问题,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<?>>
<? extends Serializer<?>>
有界泛型:
public class KafkaProtobufSerializer<T extends Message> extends AbstractKafkaProtobufSerializer<T> implements Serializer<T> {
请告诉我,我忽略了一些愚蠢:)
如果您有能力修改 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.