我有

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());

10-04 20:37