簡體   English   中英

不兼容的類型:java.lang.Class<capture#1 of ?> 無法轉換為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM