Итак, я хочу реализовать цепочку ответственности, но использовать дженерики с верхней границей.
public abstract class Handler<C extends Command> {
private Handler<? extends Command> successor;
public Handler(Handler<? extends Command> successor) {
this.successor = successor;
}
public final String handle(C cmd) {
if (canHandle(cmd)) {
return doHandle(cmd);
} else {
// The method doHandle(capture#3-of ? extends Command) in the type Handler<capture#3-of ? extends Command>
// is not applicable for the arguments (C)
return successor.doHandle(cmd);
}
}
protected abstract boolean canHandle(C cmd);
protected abstract String doHandle(C cmd);
}
abstract class Command {
public String getParamBase() {
return "base";
}
}
class CommandTypeOne extends Command {
public String getTypeOneParam() {
return "ParamTypeOne";
}
}
class CommandTypeTwo extends Command {
public String getTypeTwoParam() {
return "ParamTypeTwo";
}
}
Конечно, я мог бы иметь класс, не являющийся универсальным, и везде использовать Command в качестве параметра, и это сработало бы. Но я не хочу использовать приведение в методе doHandle для перехода к соответствующему подтипу Command. Я хочу иметь обработчик для каждого из подтипов, общий и просто связать их.
Проблема, которую я получаю: Метод doHandle(capture#3-of ? extends Command) в типе Handler неприменим для аргументов (C)
Почему, если C расширяет Command?
Command
, имеют отношение is-a кCommand
. Будет ли вашHandler
ожидать, что всеCommands
будут одного и того же подтипа? - person PaulProgrammer   schedule 16.04.2015