2011-08-10 159 views
3

我有一些类,像这样:Java继承和泛型

模型

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()方法正在实施BaseService接口的create()方法。任何人都可以告诉为什么PersonCommand未被识别为BaseCommand<BE>(在参数列表中)?

+0

我不明白你为什么要用自己参数化类... public class Person extends BaseEntity {...} – I82Much

+0

他们没有相同的返回类型也许? – talnicolas

+0

基本上我这样做,以便BaseEntity中的方法可以引用该类型。公共BE方法(); etc –

回答

7

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

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

如果您让您的方法采用BaseCommand<Person>类型的参数,那么您的代码应该能够正确编译。

+1

有意义。 BaseServiceImpl类迫使您接受所有BaseCommand 对象。谢谢您的帮助。 +1为一个很好的解释和例子。 –

+1

显然不会让我接受4分钟,但我会。再次感谢。 –