[英]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.