Java继承和泛型

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

模型

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()方法正在从BaseService接口实现create()方法.任何人都可以告诉为什么PersonCommand没有被识别为BaseCommand< BE> (在参数列表中)?

解决方法

覆盖时,方法参数不是协变的(也就是说,子类必须接受超类也接受的类型,而不是更窄的类型).

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

如果你使你的方法采用BaseCommand< Person>类型的参数,你的代码应该正确编译.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...