我有一些看起来像这样的类:
模型
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>
类型的参数,则代码应正确编译。