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

模型

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

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

最佳答案

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

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

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

09-11 18:14