我有一个类,它有一个Serializers
字段。一个valueSelializer
接受序列化程序类,该类具有SpecificRecordBase作为其参数,以及一个接受序列化程序的keySerializer
,例如StringSerializer
,IntegerSerializer
(不将泛型对象作为其参数)等。
当前的实现是
@Builder
@Data
public class FactoryProperties<T extends SpecificRecordBase> {
private Serializer<?> keySerializer;
private Serializer<T> valueSerializer;
}
public <T extends SpecificRecordBase> FactoryPropertiesBuilder<T> defaultProducerBuilderProperties(
Class<T> targetType) {
return FactoryProperties.<T>builder()
.keySerializer(new StringSerializer())
.valueSerializer(new AvroSerializer<T>());
}
问题是如果我不使用通配符<?>
,我如何指定可以接受的对象keySerializer
我最初尝试了这个
@Builder
@Data
public class FactoryProperties<S extends Object, T extends SpecificRecordBase> {
private Serializer<S> keySerializer;
private Serializer<T> valueSerializer;
}
public <S extends Object, T extends SpecificRecordBase> FactoryPropertiesBuilder<S, T> defaultProducerBuilderProperties(
Class<T> targetType) {
return FactoryProperties.<S,T>builder()
.keySerializer(new StringSerializer())
.valueSerializer(new AvroSerializer<T>());
}
但是在尝试初始化keySerializer
的值时出错
类型为 FactoryProperties.FactoryPropertiesBuilder<S,T> 中的方法 keySerializer(Serializer) 不适用于参数 (StringSerializer)
这些是可以接受String
(StringSerializer<String),Integer
(IntegerSerializer)和Byte[]
(ByteArraySerializer><byte[]>)的一些对象
。如果有人帮助我了解出了什么问题,被困在这里几个小时,将不胜感激。谢谢
public <S extends Object, T extends SpecificRecordBase> FactoryPropertiesBuilder<S, T> defaultProducerBuilderProperties(Class<T> targetType) {
return FactoryProperties.<S,T>builder()
.keySerializer(new StringSerializer())
以下是编译器的想法:
我们正在将一个实现Serializer<String>
的StringSerializer
传递给一个需要Serializer<S>
的方法。当且仅当S
String
时,这才有效。
类型S
由defaultProducerBuilderProperties()
的调用方指定,并且需要extend Object
。例如,S
可以Number
,因为Number extends Object
。
在预期Serializer<Number>
的地方通过Serializer<String>
是不行的。例如,如果有人打电话:
FactoryPropertiesBuilder<Number, T> builder = defaultProducerPropertiesBuilder(tClass);
他们希望得到一个NumberSerializer
,但你的代码给了他们一个StringSerializer
。这不是正确的类型。