Java继承和泛型

时间:2011-08-10 01:56:41

标签: java generics inheritance

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

MODEL

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

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

COMMAND

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> { ... }

服务IMPL

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>(在参数列表中)?

1 个答案:

答案 0 :(得分:7)

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

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

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