在Java 8上運行的Spring Boot應用程序中,我想實現通用行爲來處理不同類型的命令。Java 8流和責任鏈中的通用接口
下面的代碼說明了我想到的解決方案。
的通用處理器圖案
public interface Processor<C extends Command> {
TypeCommand getCommandType();
void processCommand(C command);
}
public abstract class AbstractProcessor<C extends Command> implements Processor<C> {
@Override
public void processCommand(C command) {
// Some common stuff
// ...
// Specific process
Result result = executeCommand(command);
// More common stuff
// ...
}
protected abstract Result executeCommand(C command);
}
@Component
public AddCommandProcessor extends AbstractProcessor<AddCommand> {
@Override
protected Result executeCommand(AddCommand addCommand) {
// Execute command
// ...
return result;
}
@Override
public TypeCommand getCommandType() {
return TypeCommand.ADD_COMMAND;
}
}
的命令:
public abstract class Command {
private final String uid;
private final LocalDateTime creationDate;
private final TypeCommand type;
// Constructor and getters omited ...
}
public class AddCommand extends Command {
private final Double amount;
// Constructor and getters omited ...
}
與責任鏈的服務:
@Service
public class MyService {
private final List<Processor<? extends Command>> processors;
@Autowired
public MyService(final List<Processor<? extends Command>> processors) {
this.processors = processors;
}
public void processCommand(final Command command) {
processors.stream()
.filter(p -> command.getType() == p.getCommandType())
.findFirst()
.ifPresent(processor -> processor.processCommand(command));
}
}
不幸的是,該代碼不能編譯。行:
.ifPresent(processor -> processor.processCommand(command));
失敗的消息彙總:
processCommand(capture <? extends Command>) in Processor cannot be applied to (Command)
我沒有看到任何其他的方式來做到這一點的預期。我錯在哪裏?
非常感謝。
更改'private final List>處理器;'到'私人最終名單<處理器>處理器;'如果你可以https://stackoverflow.com/questions/5857561/java-generics-fancy-capture-collision –
[什麼是PECS(生產者擴展消費者超級)?](https://stackoverflow.com/q/2723397/2711488) – Holger
更改'私人最終列表<處理器<?擴展命令>>處理器;'到'私有最終列表<處理器>處理器;'編譯,但然後Spring不會將處理器的實現注入到集合中:'( –
CrakBoom