Java 继承和泛型

标签 java generics inheritance

我有一些看起来像这样的类:

模型

public abstract class BaseEntity<O extends Object> { ... }

public class Person extends BaseEntity<Person> { ... }

命令

public abstract class BaseCommand<BE extends BaseEntity<BE>> { ... }

public class PersonCommand extends BaseCommand<Person> { ... }

服务

public interface BaseService<BE extends BaseEntity<BE>> {
    public BE create(BaseCommand<BE> command);
}

public interface PersonService extends BaseService<Person> { ... }

服务实现

public abstract class BaseServiceImpl<BE extends BaseEntity<BE>> implements BaseService<BE> { }

public class PersonServiceImpl extends BaseServiceImpl<Person> implements PersonService {
    public Person create(PersonCommand personCommand) { ... }
}

PersonServiceImpl类不会编译。它没有认识到 create()方法正在实现 create()来自 BaseService 的方法界面。谁能告诉为什么PersonCommand未被识别为 BaseCommand<BE> (在参数列表中)?

最佳答案

重写时,方法参数不是协变的(也就是说,子类必须接受父类(super class)也接受的类型,而不是更窄的类型)。

这是因为人们可以使用您的 PersonServiceImpl通过 PersonService接口(interface),它将接受类型为 BaseCommand<Person> 的参数那不一定是 PersonCommand (想象一下,如果您创建了第二个扩展 BaseCommand<Person> 的类)。

如果你让你的方法接受类型为 BaseCommand<Person> 的参数,您的代码应该可以正确编译。

关于Java 继承和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7005086/

相关文章:

java - 有关 web.xml 中的 <data-source> 标记的更多信息

Java 泛型 : why can't inner interface implement from a (inner) superinterface?

java - 对假客户端的通用响应支持

java - 在子类的方法中本地调用父类(super class)方法时使用 "super"关键字或使用父类(super class)实例?

Python继承——如何继承类函数?

java - 用于存储海量数据的最佳集合

java - 从包含 JAR 的 XML 文件中读取

c# - 确定 myinstance 是否为 Generic<T>

c# - 将扩展类与基类合并

java - onTextChangedListener 进入循环,但仅在第一个 ListView 元素上,任何后续元素都不会循环