我想收集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()
方法。
我希望这将允许将所描述类型的任何子类都接受为参数。但是显然,这是行不通的。
有什么办法可以解决?
预先感谢
答案 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());
}
}