我有一些看起来像这样的类:
模型
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/