簡體   English   中英

如何設計此方法的簽名

[英]How to design the signature of this method

我需要定義一個方法,該方法接受一個請求並返回一個響應:

  public MyResponse submit(MyRequest request){                      A
      ....
  }

這看起來很簡單。 然而:

MyRequest可以有許多子類

 public class HolidayRequest extends MyRequest {}
 public class FundingRequest extends MyRequest {}
 public class BudgetRequest extends MyRequest {}

這同樣適用於響應類:

 public class HolidayResponse extends MyResponse {}
 public class FundingResponse extends MyResponse {}
 public class BudgetResponse extends MyResponse {}

該方法的用戶submit可以通過在任何類型的請求,並獲得相應的響應對象,例如:在HolidayRequest傳遞將返回HolidayResponse。

盡管上面仍然定義的接口工作,用戶必須投的返回值submit從MyResponse到一個特定的響應類型。

然后,我認為將方法更改為:

  public <T extends MyResponse, S extends MyRequest>                B
  T submit(S request){
      ....
  }

這使返回類型可以是特定類型,而不是父類型。 但是,用戶仍然可以編寫如下代碼:

  HolidayResponse response = submit(new FundingRequest());

並且代碼仍將編譯,但在運行時失敗。

然后,我意識到Submit方法不需要知道請求的類型,因此無需為MyRequest使用類型參數,我想我可以將其進一步簡化為:

  public <T extends MyResponse>                                    C
  T submit(MyRequest request){
      ....
  }

但是同樣,該問題與上面提到的問題相同,用戶可以傳遞請求類型並期望其他響應類型。

我的問題是如何正確定義此方法的簽名? 您將使用上面A,B和C定義中的哪一個? 還是可能有更合適的方法來定義它?

非常感謝你。

您必須將您的Request到您的Response

例如,將MyRequest類更改為

public abstract class MyRequest<T extends MyResponse> {

現在,您的HolidayRequest如下所示:

public class HolidayRequest extends MyRequest<HolidayResponse> {

現在,您的方法簽名可以強制MyReponse進行MyReponse

public <R extends MyResponse, S extends MyRequest<R>> R submit(S request){

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM