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

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

最佳答案

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

关于java - 在泛型中使用继承的有问题的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26481029/

相关文章:

java - 组布局错误: can't find the wrong line in my code

java - 关于Java中ArrayDeque的实现

java - 如何处理 Java 中的可互换基类

java - 在编译时解析静态方法

C11 - 通用选择中的枚举

inheritance - Haxe - 如何将变量声明为父类或子类的实例

java - 从文件中读取。安卓、Java

java - SpringBoot 没有主 list 属性(maven)

ios - 关联类型错误 : Cannot assign a value of type '[SpecificType]' to a value of type '[NameOfTypeAlias]'

generics - ForEach 中的内容不应该符合 View 吗