2015-10-04 49 views
0

我在實現這種抽象方法時出錯。我的目標是能夠使參數中的任何類實現接口DataOutput,例如DataOutputStream實現抽象類中的接口參數

摘要方法在抽象類:

public abstract void writeMethods(DataOutput o) throws IOException; 

在擴展類實現抽象方法:

public void writeMethods(DataOutputStream d) throws IOException {} 
+0

您需要實現完全相同的簽名。你在這裏有什麼問題? – m02ph3u5

回答

2

你實際上不能。 通過簽名,你有,如果你想的方法更具體的您可以創建一個接受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 

} 

}

+0

簡單而輝煌!謝謝! –

1

的方法定義

public void writeMethods(DataOutputStream d) throws IOException 

不同210

as DataOutputStream and DataOutput是不同的。在你的具體方法中,DataOutput可以是DataOutputStream的一個實例,但是你不能在方法簽名中這樣聲明它。

2

你不能那樣做。如果抽象方法的參數類型爲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) { ... } 
} 
+0

如果可以擴展多個類,這將工作。但我的練習的重點是瞭解抽象與接口類。你的答案對此有幫助,並且還教給我一些關於泛型的知識。謝謝! :) –