[英]Java Generics - Not Applicable for the Arguments
我有一个 class ,它有一个获取Serializer
的字段。 valueSelializer
将接受一个序列化器 class,它有一个SpecificRecordBase
作为它的 arguments。
@Builder
@Data
public class FactoryProperties<T extends SpecificRecordBase> {
private Serializer<?> keySerializer;
private Serializer<T> valueSerializer;
}
但是,当我创建一个输入默认值的方法时
public <T extends SpecificRecordBase> FactoryPropertiesBuilder<T> defaultFactoryProperties(
Class<T> targetType) {
return FactoryProperties.builder()
.keySerializer(new StringSerializer())
.valueSerializer(new MySerializer<T>());
}
public class MySerializer<T extends SpecificRecordBase> implements Serializer<T>
我遇到错误说Type mismatch: cannot convert from FactoryProperties.FactoryPropertiesBuilder<SpecificRecordBase> to FactoryProperties.FactoryPropertiesBuilder<T>
根据我的理解, T
已经是一个SpecificRecordBase
。 有人可以告诉我代码和逻辑有什么问题吗?
builder
是一个通用方法。 如果你delombok它,你会看到它:
public static <T extends SpecificRecordBase> FactoryPropertiesBuilder<T> builder() {
return new FactoryPropertiesBuilder<T>();
}
您尚未为builder
调用指定泛型类型参数,因此编译器需要推断T
的类型。 请注意,这里没有很多信息。 它不会 go 检查valueSerializer
调用并查看您实际上希望T
( builder
的类型参数)为T
( defaultFactoryProperties
的类型参数)。
所以编译器只是推断T
是它的绑定 - SpecificRecordBase
。 这就是valueSerializer
需要Serializer<SpecificRecordBase>
的原因。
您应该明确指定类型参数:
return FactoryProperties.<T>builder()
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.