Java继承和泛型

Sno*_*irl 3 java generics inheritance

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

模型

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

public class Person extends BaseEntity<Person> { ... }
Run Code Online (Sandbox Code Playgroud)

命令

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

public class PersonCommand extends BaseCommand<Person> { ... }
Run Code Online (Sandbox Code Playgroud)

服务

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

public interface PersonService extends BaseService<Person> { ... }
Run Code Online (Sandbox Code Playgroud)

服务进展

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

public class PersonServiceImpl extends BaseServiceImpl<Person> implements PersonService {
    public Person create(PersonCommand personCommand) { ... }
}
Run Code Online (Sandbox Code Playgroud)

PersonServiceImpl班将无法编译.它没有意识到该create()方法是create()BaseService接口实现该方法.任何人都可以告诉为什么PersonCommand不被识别为BaseCommand<BE>(在参数列表中)?

Chr*_*ung 7

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

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

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