По сути, я хочу общий
метод "process" для определения типа
универсального параметра Команды
объект.
Это противоречит идее определения команды в качестве параметра типа для включающего типа: при создании экземпляра CommandProcessor
для C
может быть указан фактический тип, такой как Command<String>
. Можно было бы даже предоставить не универсальный тип, такой как
class Foo implements Command<String> {
...
}
Что тогда будет означать C<R>
? Foo<R>
? Command<String><R>
? Command<R>
?
Итак, какие у вас есть варианты? Если CommandProcessor нужно работать только с определенным типом возврата, вы можете сделать:
class CommandProcessor<R, C extends Command<R>> {
R process(C command);
}
class FancyCommandProcessor<R, C extends FancyCommand<R>> extends CommandProcessor<R,C> {
}
Однако я подозреваю, что вы хотите, чтобы CommandProcessor работал со всем типом семейства команд. Это само по себе не будет проблемой, просто объявите:
<R> R process(FancyCommand<R> command);
Если, однако, вы дополнительно хотите установить связь подтипов между CommandProcessors для разных семейств команд, чтобы вы могли переопределить process
, вы рискуете выйти за пределы выразительности обобщений Java. В частности, вам понадобится либо эквивалент параметров типа «шаблон» в C ++ (которые позволяют передавать шаблон в качестве фактического аргумента типа), либо возможность захвата параметра типа Command с учетом фактического аргумента типа, который известен как расширение Command , Java не поддерживает ни того, ни другого.