簡體   English   中英

如何實例化包含復雜泛型類型的集合

[英]How to instantiate a collection containing a complex generic type

我正在使用這樣定義的第三方類型:

abstract public class BaseRequest<T extends BaseRequest<T, R>, R extends BaseResponse>

我想維護一個此類對象的隊列並定期執行請求。 我有execute方法的語法:

protected <T extends BaseRequest<T, R>, R extends BaseResponse> void execute(T request, int tryCount) {

我不知道該怎么做是實例化一個包含這種類型對象的隊列。 我什至不確定這是否可能並且也會滿足於Queue<BaseRequest<?, ?>>但是當我調用execute時無法弄清楚如何轉換為我需要的類型。

我確信這個問題之前已經得到了回答,對此我深表歉意,但我不知道如何以一種我可以搜索答案的方式來表達這個問題。

編輯,這是execute方法的精簡版本,顯示了為什么我需要類型化對象。 thirdPartyApiWrapper有一個執行簽名,其中包括一個回調接口,我必須使用匿名內部 class 實現該接口,這需要指定類型。

protected <T extends BaseRequest<T, R>, R extends BaseResponse> void execute(T request) {
    thirdPartyApiWrapper.execute(request, new Callback<T, R>() {
        @Override
        public void onResponse(BaseRequest request, BaseResponse response) {

        }
        @Override
        public void onFailure(BaseRequest request, IOException e) {

        }
    });
}

如您所知,通過將內容放入Queue<BaseRequest<?, ?>> ,您將丟失有關BaseRequest的類型信息。

您無法在要執行它時恢復它,您需要它才能傳遞回調。

我建議您改為維護一個實例隊列,這些實例將BaseRequest和兼容的回調放在一起:

class RequestAndCallback<T, R> {
  RequestAndCallback(BaseRequest<T, R> request, Callback<T, R> callback) {
    // store in fields.
  }

  void execute() {
    thirdPartyApiWrapper.execute(request, callback);
  }
}

請注意,您無需知道類型參數即可在此處調用execute() :您可以只擁有一個Queue<RequestAndCallback<?, ?>> ,然后按照自己的方式進行操作。

暫無
暫無

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

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