2015-04-30 146 views
1

我有一個類:的Java:抽象泛型類構造函數的參數

public abstract class Response<T> { 
    private boolean isSucessfull; 
    private T data; 

    public Response() { 
     throw new IllegalArgumentException(); 
    } 

    public Response(boolean isSucessfull, T data) { 
     this.isSucessfull = isSucessfull; 
     this.data = data; 
    } 

    ... 
} 

和其它類是與一些特定類型的擴展:

public class PlainResponse extends Response<byte[]>{ 
    // 
} 

出現的問題,當我嘗試創建一個實例PlainResponse的:new PlainResponse(success, responseData)

constructor PlainResponse in class PlainResponse cannot be applied to given types; 
required: no arguments 
found: boolean,byte[] 

正如您可以猜到,我不是在Java方面的專家。但我預料到,我的課程將使用超級課程的構造函數。

我該如何實現它?
謝謝。

+0

請注意,如果您首先在「響應」中沒有無參數的構造函數,則不會遇到此問題。鑑於在沒有引發異常的情況下實際調用是不可能的,因此最好不要將它首先定義。然後編譯器可以要求'PlainResponse'有一個調用父'(boolean,T)'構造函數的構造函數。 – dimo414

回答

3

但我期望,我的課程將使用它的超類的構造函數。

事實並非如此。構造函數不會被繼承。通常,子類的創建方式與其父類完全不同,或者需要對其成員變量添加額外的不變量,所以通常讓構造函數被繼承並不是一個好主意。

所以,你會在你的PlainResponse類的Response所有其他子類定義構造函數

public PlainResponse(boolean isSucessfull, byte[] data) { 
    super(isSuccessfull, data); 
    // optionally more work 
} 

如果您沒有在類中定義構造函數,Java將爲您創建一個沒有參數的默認構造函數。這是您收到特定錯誤消息的原因。

+0

不太確定第一個斷言。所有成員變量在Java中都有初始值;因爲你總是可以寫一個只包含'super(same-arguments)'的構造函數,所以語言可能已經規定構造函數可以被繼承並且只調用超類的構造函數是「可能的」。但這可能不是一個好主意。它引發了太多的事故。 – ajb

+0

@ajb。好點子。我相應地編輯了答案。 – Hoopje

0

OOP 不允許自動繼承constructors形式parent classchild class。這就是爲什麼如果出現這個錯誤是沒問題的

如果您需要調用父類的構造函數,在子類中聲明一個帶有參數的構造函數,並從中調用super(arg1,arg2)

public class PlainResponse extends Response<byte[]>{ 

    public PlainResponse(boolean isSucessfull, byte[] data) 
    { 
     super(isSucessfull,data); 
    } 
} 
0

問題是構造函數不會在子類中繼承,所以你得到一個沒有參數的默認構造函數。 如果子類調用父類的構造函數,那麼你需要做它自己的構造函數。

public class PlainResponse extends Response<byte[]>{ 
    public PlainResponse (boolean isSucessfull, T data) { 
     super(isSucessfull,data); 
    } 
}