在抽象类我有方法:
abstract void method(Holder<?> holder);
并且在实现类中(会有多个像这样的类,每个类都有自己的类型 - SomeClass,SomeClass2,..):
@Override
void method(Holder<SomeClass> aHolder) {...}
这不起作用,那么我错过了什么?
有编译错误: &#34;方法不会覆盖超类&#34;
中的方法答案 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;而是在类级别声明您在每个实现上使用的类型。