Я имеюПроблемные декларация с использованием наследования в дженериков
LoginCommandExecutor implements CommandExecutor<LoginCommand>
LoginCommand implements Command
Почему эта линия бросает ошибку компиляции:
CommandExecutor<Command> a = new LoginCommandExecutor(commander, null);
Но это работает для обоих следующих параметров:
CommandExecutor<? extends Command> a = new LoginCommandExecutor(commander, null);
CommandExecutor b = new LoginCommandExecutor(commander, null);
И если оба работают, что предпочтительнее? Зачем?
, потому что вижу а и б показывает те же методы в IDE
спасибо. Но разве это не противоречит наследованию ООП? 'CommandExecutor a' раскрывает методы базового класса, которые в любом случае реализует' LoginCommand'. Нет? Не наоборот: это не означает, что 'LoginCommand' может быть передан любому классу, который наследует базовый класс (aka' Command'). –
LoginCommandExecutor способен обрабатывать LoginCommands. Таким образом, вы действительно не хотите, чтобы они могли отправлять ему другие команды. Точно так же, как вы не хотите хранить целые числа в «Список». –
Я просто не понимаю разницу в объявлениях: 'CommandExecutor extends Command> 'и' CommandExecutor ' –