我有
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);
如果两者都起作用,哪个更可取?为什么?
因为我看到a和b在IDE中揭示了相同的方法
最佳答案
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());