我在實現這種抽象方法時出錯。我的目標是能夠使參數中的任何類實現接口DataOutput
,例如DataOutputStream
。實現抽象類中的接口參數
摘要方法在抽象類:
public abstract void writeMethods(DataOutput o) throws IOException;
在擴展類實現抽象方法:
public void writeMethods(DataOutputStream d) throws IOException {}
我在實現這種抽象方法時出錯。我的目標是能夠使參數中的任何類實現接口DataOutput
,例如DataOutputStream
。實現抽象類中的接口參數
摘要方法在抽象類:
public abstract void writeMethods(DataOutput o) throws IOException;
在擴展類實現抽象方法:
public void writeMethods(DataOutputStream d) throws IOException {}
你實際上不能。 通過簽名,你有,如果你想的方法更具體的您可以創建一個接受DataOutputStream類和抽象方法的實現被稱爲另一種方法來實現與相同類型的類
方法:
public void writeMethods(DataOutputStream d) throws IOException {
//do something
}
@Override
public void writeMethods(DataOutput d) throws IOException {
if(d instanceof DataOutputStream)
writeMethods((DataOutputStream) d)
else
.... // something else
}
}
簡單而輝煌!謝謝! –
的方法定義
public void writeMethods(DataOutputStream d) throws IOException
比
不同210as DataOutputStream
and DataOutput
是不同的。在你的具體方法中,DataOutput
可以是DataOutputStream
的一個實例,但是你不能在方法簽名中這樣聲明它。
你不能那樣做。如果抽象方法的參數類型爲DataOutput
,則不能用帶有參數類型爲DataOutputStream
的參數的方法覆蓋它。返回類型可以更具體,但不是參數。
您可以使用泛型來做類似的事情。
public abstract class MyAbstractClass<T extends DataOutput> {
public abstract void writeMethods(T t);
}
public class MyClass extends MyAbstractClass<DataOutputStream> {
@Override
public void writeMethods(DataOutputStream d) { ... }
}
如果可以擴展多個類,這將工作。但我的練習的重點是瞭解抽象與接口類。你的答案對此有幫助,並且還教給我一些關於泛型的知識。謝謝! :) –
您需要實現完全相同的簽名。你在這裏有什麼問題? – m02ph3u5