简体   繁体   English

不兼容的类型:java.lang.Class<capture#1 of ?> 无法转换为

[英]Incompatible types: java.lang.Class<capture#1 of ?> cannot be converted to

I have a rather weird problem with generics, where Java reports a compilation error.我对泛型有一个相当奇怪的问题,Java 报告编译错误。

Background: I am creating my own Kafka client wrapper.背景:我正在创建自己的 Kafka 客户端包装器。 One thing I need to support is for users of lib to supply their own key serializer class and value serializer class.我需要支持的一件事是让 lib 用户提供他们自己的关键序列化器类和值序列化器类。

Let's say that I have:假设我有:

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;
}

Now, at the call-site, if I do:现在,在呼叫站点,如果我这样做:

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

// ...

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

It works perfectly.它完美地工作。 However, if I attempt :但是,如果我尝试:

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

// ...

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

It screams with a compilation error:它尖叫着编译错误:

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

which does not make any sense to me.这对我没有任何意义。 After all, KafkaProtobufSerializer conforms the <? extends Serializer<?>>毕竟, KafkaProtobufSerializer符合<? extends Serializer<?>> <? extends Serializer<?>> bounded generic: <? extends Serializer<?>>有界泛型:

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

Please tell me that I overlooked some silliness :)请告诉我,我忽略了一些愚蠢:)

There are a few options you could try, if you have the ability to modify your Builder class:如果您有能力修改 Builder 类,则可以尝试以下几个选项:

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

or removing the ?或删除? from Serializer:来自序列化程序:

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.

相关问题 EasyMock Java:不兼容的类型:java.lang.ClassLoader无法转换为java.lang.Class <capture#1 of ? extends > - EasyMock java: incompatible types: java.lang.ClassLoader cannot be converted to java.lang.Class<capture#1 of ? extends > 修复 java 中的错误:不兼容的类型:java.lang.Object 无法转换为 capture#1 of? - Fixing error in java: incompatible types: java.lang.Object cannot be converted to capture#1 of? 无与伦比的类型:java.lang.Class<capture#1 of ? extends T[]> 和 java.lang.Class<java.lang.Object[]> - Incomparable types: java.lang.Class<capture#1 of ? extends T[]> and java.lang.Class<java.lang.Object[]> 类型安全合并 Map 与多种类型的值; `不兼容的类型 java.lang.Object 无法转换为捕获 #1 的 ?` - Type safe merging of Map with multiple types for its value; `incompatible types java.lang.Object cannot be converted to capture#1 of ?` 修复 SQL 错误不兼容类型:capture#1 of? 无法转换为 int - Fix SQL error incompatible types: capture#1 of ? cannot be converted to int 不兼容的类型:推理变量T具有不兼容的边界等式约束:捕获#1的? 扩展java.lang.Object - incompatible types: inference variable T has incompatible bounds equality constraints: capture#1 of ? extends java.lang.Object Java:不兼容的类型:java.lang.String 不能转换为 int - Java:incompatible types: java.lang.String cannot be converted to int java:不兼容的类型:T 无法转换为 java.lang.String - java: incompatible types: T cannot be converted to java.lang.String 不兼容的类型:卡无法转换为java.lang.String - Incompatible types: Card cannot be converted to java.lang.String 不兼容的类型:java.lang.String 不能转换为 int[] - incompatible types: java.lang.String cannot be converted to int[]
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM