【问题标题】:Java Generics - Not Applicable for the ArgumentsJava 泛型 - 不适用于参数
【发布时间】:2021-02-23 21:19:35
【问题描述】:

我有一个类有一个获取Serializer 的字段。 valueSelializer 将接受一个以SpecificRecordBase 作为参数的序列化器类。

@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&lt;SpecificRecordBase&gt; to FactoryProperties.FactoryPropertiesBuilder&lt;T&gt;

根据我的理解T 已经是SpecificRecordBase。有人可以告诉我代码和逻辑有什么问题吗?

【问题讨论】:

  • FactoryProperties.builder&lt;T&gt;() 工作吗?
  • @dan1st 尝试添加它,它给了我一个错误Syntax error on token "(", Expression expected after this token

标签: java generics serialization


【解决方案1】:

builder 是一个通用方法。如果你delombok它,你会看到它是:

public static <T extends SpecificRecordBase> FactoryPropertiesBuilder<T> builder() {
    return new FactoryPropertiesBuilder<T>();
}

您没有为builder 调用指定泛型类型参数,因此编译器需要推断T 的类型。请注意,这里没有很多信息。它不会检查valueSerializer 调用并查看您实际上希望Tbuilder 的类型参数)为TdefaultFactoryProperties 的类型参数)。

所以编译器只是将T 推断为其绑定 - SpecificRecordBase。这就是为什么 valueSerializer 需要 Serializer&lt;SpecificRecordBase&gt;

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

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

【讨论】:

  • 感谢您的详细解释。被困在这里好几个小时了。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2023-03-18
  • 1970-01-01
  • 2016-11-17
相关资源
最近更新 更多