我有
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中显示相同的方法
答案 0 :(得分: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>
接受任何类型的Command。如果编译器接受了它,你可以
CommandExecutor<Command> a = new LoginCommandExecutor(commander, null);
a.submit(new WhateverCommand());