2014-10-21 2 views
0

Я имеюПроблемные декларация с использованием наследования в дженериков

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

ответ

5
CommandExecutor b = new LoginCommandExecutor(commander, null); 

использует необработанный тип. Это определенно не должно использоваться.

CommandExecutor<? extends Command> a = new LoginCommandExecutor(commander, null); 

правильно, но скрывает тот факт, что у вас есть на самом деле является CommandExecutor<LoginCommand>. Вы не сможете отправить какую-либо команду этому исполнителю, так как тип команды, принятой исполнителем, неизвестен.

CommandExecutor<Command> a = new LoginCommandExecutor(commander, null); 

является неправильным, так как LoginCommandExecutor принимает только LoginCommand, в то время как CommandExecutor<Command> принимает любые командования. Если это было принято компилятором, вы можете сделать

CommandExecutor<Command> a = new LoginCommandExecutor(commander, null); 
a.submit(new WhateverCommand()); 
+0

спасибо. Но разве это не противоречит наследованию ООП? 'CommandExecutor a' раскрывает методы базового класса, которые в любом случае реализует' LoginCommand'. Нет? Не наоборот: это не означает, что 'LoginCommand' может быть передан любому классу, который наследует базовый класс (aka' Command'). –

+1

LoginCommandExecutor способен обрабатывать LoginCommands. Таким образом, вы действительно не хотите, чтобы они могли отправлять ему другие команды. Точно так же, как вы не хотите хранить целые числа в «Список ». –

+0

Я просто не понимаю разницу в объявлениях: 'CommandExecutor 'и' CommandExecutor ' –

Смежные вопросы