我写了一些带有继承的泛型,但无法让它工作类型安全。我的目标是提供一般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();
}
答案 0 :(得分:1)
存在用于静态类型检查的泛型。在你写的时候
我的目标是提供一个通用的BaseService,我可以执行action(base)方法,无论基础对象是Foo扩展Base还是Bar扩展Base。
表示您不希望进行任何静态类型检查。因此,要实现这一点,参数类型应为Base
而不是T
。
由于getService()
的返回类型为BaseService<? extends Base>
,编译器甚至无法知道T
是什么(除了它是Base
的某个未知子类型之外)所以你根本无法调用action
方法。但即使getService()
的返回类型为FooService
,参数类型T
也会为Foo
,因此您无法使用Base
类型调用它。
您可能应该多考虑一下您希望编译器通过使用泛型来检查的内容。