如何使用泛型继承?

时间:2013-04-01 01:49:13

标签: java generics

我写了一些带有继承的泛型,但无法让它工作类型安全。我的目标是提供一般BaseService,我可以执行action(base)方法,无论base对象是Foo extends Base还是Bar extends Base。< / p>

以下不起作用,为什么?

class Base;
class Foo extends Base;

interface BaseService<T extends Base> {
    void action(T base);
}

class FooService implements BaseService<Foo> {
    void action(Foo foo) {
    }
}


//usage:
//complains that the method is not applicable for the argument,
//and that I should change action(T) to action(Base). Why?
Base base;
getService().action(base);


//just to demonstrate the problem
BaseService<? extends Base> getService() {
    return new FooService();
}

1 个答案:

答案 0 :(得分:1)

存在用于静态类型检查的泛型。在你写的时候

  

我的目标是提供一个通用的BaseService,我可以执行action(base)方法,无论基础对象是Foo扩展Base还是Bar扩展Base。

表示您不希望进行任何静态类型检查。因此,要实现这一点,参数类型应为Base而不是T

由于getService()的返回类型为BaseService<? extends Base>,编译器甚至无法知道T是什么(除了它是Base的某个未知子类型之外)所以你根本无法调用action方法。但即使getService()的返回类型为FooService,参数类型T也会为Foo,因此您无法使用Base类型调用它。

您可能应该多考虑一下您希望编译器通过使用泛型来检查的内容。