在泛型中使用继承的有问题的声明

时间:2014-10-21 07:20:54

标签: java generics inheritance interface

我有

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中显示相同的方法

1 个答案:

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