繁体   English   中英

Java Generics - 不适用于 Arguments

[英]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调用并查看您实际上希望Tbuilder的类型参数)为TdefaultFactoryProperties的类型参数)。

所以编译器只是推断T是它的绑定 - SpecificRecordBase 这就是valueSerializer需要Serializer<SpecificRecordBase>的原因。

您应该明确指定类型参数:

return FactoryProperties.<T>builder()
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM