首页 > 解决方案 > 具有构建器模式的通用对象

问题描述

我的类中有一个Producer<?, ?> producer字段,该字段的实现取决于使用构建器模式的给定状态,例如:

private void changeImplementation(int state) {
    switch (state) {
        case 0:
            producer = builder
                           .setKey(Long.class)
                           .setValue(String.class)
                           .setOtherStuff(...)
                           .build() // return the object with correct key and value
        break;
        case 1:
            ...
}

但是每当我调用 producer 上的方法时(例如使用 types Producer<Long, String>),就会给出这个错误(Eclipse EE):

The method method(Record<capture#9-of ?,capture#10-of ?>) in the type Producer<capture#9-of ?,capture#10-of ?> is not applicable for the arguments (Record<Long,String>)

在方法调用之前build()或内部进行强制转换没有帮助。构建模式在项目的其他地方完美运行。

标签: javaeclipsegenericsdesign-patternscasting

解决方案


问题与构建器模式无关,而是您的producer字段类型是用 unknown type 调用的?。因此,您只能将值分配给Producer作为未知类型子类型的泛型类型的参数。但是,类型是子类型的唯一值?null,因此它确实限制了您可以使用Producer<?,?>.

要解决这个问题,您必须以不同的方式绑定通用类型的设计事物。


推荐阅读