Java泛型方法的继承

时间:2016-04-26 09:03:36

标签: java generics inheritance

在抽象类我有方法:

abstract void method(Holder<?> holder);

并且在实现类中(会有多个像这样的类,每个类都有自己的类型 - SomeClass,SomeClass2,..):

@Override
void method(Holder<SomeClass> aHolder) {...}

这不起作用,那么我错过了什么?

有编译错误: &#34;方法不会覆盖超类&#34;

中的方法

2 个答案:

答案 0 :(得分:3)

关键是void method(Holder<?> holder)的实施需要能够接受以下任何一项:Holder<SomeClass>Holder<SomeClass2>Holder<Void>

如果您尝试在子类中将方法声明为void method(Holder<SomeClass> holder),这意味着您可以在持有者上调用提供者方法(例如SomeClass value = holder.get()),但如果使用类强制转换异常则会失败例如,参数实际上是Holder<Void>类型。

因此,类型系统禁止使用。

您需要在类级别拥有一个类型变量:

abstract class BaseClass<T> {
  abstract void method(Holder<T> aHolder);
}

然后你可以创建具体的类:

class SomeClassBaseClass extends BaseClass<SomeClass> {
  @Override void method(Holder<SomeClass> aHolder) {}
}

答案 1 :(得分:1)

您尝试使用&#34;更具体的&#34;覆盖?实施不会接受&#34;?&#34;,它只接受&#34; SomeClass&#34;,因此它会破坏&#34;合同&#34;与抽象类。

如果您考虑实施与您的班级互动的其他课程,则会更容易理解 你会期望它接受任何类类型,因为它声明&#34;?&#34;,但如果它只接受&#34; SomeClass&#34;它会打破你的系统。

你应该使用通用&#34; T&#34;而是在类级别声明您在每个实现上使用的类型。