我無法編譯需要重寫使用泛型作爲其中一個參數的抽象類超類型的方法的方法。編譯器會抱怨擴展類的setRef()方法不會覆蓋超類型的方法。使用抽象類的泛型參數覆蓋方法
父抽象類:
public abstract class AbsClass<Q extends Interf> {
public abstract Ref<? extends AbsClass<Q>> getRef();
public abstract <M extends AbsClass<Q>> void setRef(Ref<M> newRef);
}
裁判:
public interface Ref<M extends AbsClass<? extends Interf>> { }
和INTERF是:
public interface Interf { }
擴展子類(setRef()不編譯):
public class ChildClass extends AbsClass<InterfImpl> {
@Override
public Ref<ChildClass> getRef() {
return null;
}
@Override
public <M extends ChildClass> void setRef(Ref<M> newRef) {
return null;
}
}
我也試過使用通配符,並收到相同的錯誤。使用通配符,抽象類setRef()是:
public abstract void setRef(Ref<? extends AbsClass<Q>> newRef);
和延伸類setRef()是:
public void setRef(Ref<ChildClass> newRef)
甚至:
public void setRef(Ref<? extends ChildClass> newRef)
的只有這樣才能讓它編譯的是,如果擴展類'setRef()使用抽象類「類型:
public <M extends AbsClass<Interf>> void setRef(Ref<M> newRef)
但我想限制newRef參數的鍵入爲Ref<ChildClass>
或子類型,所以這不是完美的。我如何讓我的擴展類只允許ChildClass或它的子類型爲setRef()方法的newRef參數?我的一部分困惑是ChildClass的getRef()返回值處理泛型輸入,並且setRef()參數上的相同「簽名」無法編譯。幫幫我?謝謝!
請包括堆棧跟蹤。 –
@Tim,他正在談論編譯時錯誤。 – Codebender
正確,沒有堆棧跟蹤,只是編譯器錯誤:「ChildClass類型的方法setRef(Ref)必須覆蓋或實現超類型方法。」這是來自方法聲明的'public void setRef(Ref newRef)'形式。 –