我有一些看起来像这样的课程:
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>
(在参数列表中)?
答案 0 :(得分:7)
覆盖时,方法参数不是协变的(也就是说,子类必须接受超类也接受的类型,而不是更窄的类型)。
这是因为人们可以通过PersonServiceImpl
界面使用您的PersonService
,这会接受BaseCommand<Person>
类型的参数,该参数不一定是PersonCommand
(想象一下如果你创建了第二个扩展BaseCommand<Person>
)的类。
如果使方法采用BaseCommand<Person>
类型的参数,则代码应该正确编译。