2016-04-26 37 views
0

在抽象类中,我有方法:Java泛型方法的传承

abstract void method(Holder<?> holder); 

和实现类(将有多个类像这样的,每一个都有自己的类型 - SomeClass的,SomeClass2,..):

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

这不起作用,所以我失踪了什么?

有编译器错误: “方法无法从它的超重写方法”

+0

什么是确切的错误? –

+0

要覆盖addDocs(),而不是()方法 –

+0

对不起,我就来修正一下...... “方法”是实际重写, 的一个但这不是问题 – Dejan

回答

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

你试图用一个“更具体的”实施覆盖如果不接受“?”,它只会接受“SomeClass”,因此它会打破与抽象类的“契约”。

它更容易理解,如果你想实现其他类,将与你的类交互。
你希望它接受任何类类型,因为它宣称“?”,但如果只接受“SomeClass的”它会破坏你的系统。

你应该在类级别使用通用的“T”代替,并宣布你正在使用的每个执行的类型。