如何将不同参数的使用者添加到列表中?

时间:2019-10-10 19:15:13

标签: java generics

我想收集Processors可以使用不同参数的列表。

以下是一些示例类

public abstract class AbstractHistory { 
    public String getTlp() { return "";  }          
    }

public class SynchResourcConfig {
   public boolean isEnabled() { return true); }
  }

public class SynchClassTlpFilterConfig extends SynchResourcConfig {
    public String getClass() { return ""; } 
  }

这是我希望列表中的每个元素都实现的界面

public interface ConfigProcessingFilter {
    public boolean shouldProcess(AbstractHistory history, SynchResourceConfig config);
}

理想情况下,此类应将所有处理器保存在列表中

想法是,当调用“ shouldProcess()”时,它可以使用任何包含的处理器的结果进行回复。

public class ConfigProcessor {

    protected List<ConfigProcessingFilter> filters = new ArrayList<>();

    public boolean shouldProcess(AbstractHistory history, SynchResourceConfig config) {
        return config.isEnabled() && filters.stream().anyMatch(
            (filter) -> filter.shouldProcess(history, config));
    }

    public ConfigProcessor addFilter(ConfigProcessingFilter filter) {
        filters.add(filter);
        return this;
    }
}

困境

我也想允许处理列表中数据的子类。但是我得到了构造函数注释中指示的错误。

public class ClassTlpProcessingFilter extends ConfigProcessor {

    public ClassTlpProcessingFilter() {
        /*
        Compiler underlines: `processByClassTlp()` with error:
        The method processByClassTlp(AbstractHistory, SynchClassTlpFilterConfig) 
        in the type ClassTlpProcessingFilter is not applicable 
        for the arguments (AbstractHistory, SynchResourceConfig)
        */
        addFilter((history, config) -> processByClassTlp(history, config));
    }

    public boolean processByClassTlp(AbstractHistory history, SynchClassTlpFilterConfig config) {
        return config.getClass().equals(history.getTlp());

    }

}

查看问题

列表包含ConfigProcessingFilter。每个项目都有一个shouldProcess()方法。

我希望这将允许将所描述类型的任何子类都接受为参数。但是显然,这是行不通的。

有什么办法可以解决?

预先感谢

1 个答案:

答案 0 :(得分:0)

我想我想出了办法。如果我从最低的子类一直到父类一直传播元素的类型,这似乎是可行的。

接口已使用参数类型更新

public interface ConfigProcessingFilter<H extends AbstractHistory, C extends SynchResourceConfig> {
    public boolean shouldProcess(H history, C config);
}

处理器已更新,可以在通用类型上运行

public class ConfigProcessor<H extends AbstractHistory, C extends SynchResourceConfig> implements ConfigProcessingFilter<H, C> {

    private List<ConfigProcessingFilter<H, C>> filters = new ArrayList<>();

    public boolean shouldProcess(H history, C config) {
        return config.isEnabled() && filters.stream().anyMatch(
                (filter) -> filter.shouldProcess(history, config));
        }
    }

    public ConfigProcessor addFilter(ConfigProcessingFilter<H, C> filter) {
        filters.add(filter);
        return this;
    }
}

更新到子类

public class ClassTlpProcessingFilter<H extends AbstractHistory, C extends SynchClassTlpFilterConfig> extends ConfigProcessor<H, C> {

    public ClassTlpProcessingFilter() {
        addFilter((history, config) -> processByClassTlp(history, config));
    }

    public boolean processByClassTlp(AbstractHistory history, SynchClassTlpFilterConfig config) {
        return config.getClass().equals(history.getTlp());

    }
}