簡體   English   中英

傳遞泛型類型的問題

[英]Issue with passing generic type

我正在嘗試做這樣的事情:

public class ResponseProcessorFactory {

    public static <T> ResponseProcessor<T> newResponseProcessor(){
        return new GsonResponseProcessor<T>();
    }    
}

public class GsonResponseProcessor<T> implements ResponseProcessor<T> {

    protected T response;
    protected TypeToken typeToken;

    public GsonResponseProcessor() {
        this.typeToken = new TypeToken<T>(){};
    }

    @Override
    public void parse(String jsonString) throws JSONException, IOException {
            response = GsonHelper.getGsonInstance().fromJson(jsonString, typeToken.getType());
    }

    public T getResponse() {
        return response;
    }
}


private void ResponseProcessor getResponseProcessor(){
       return ResponseProcessorFactory<List<String>>.newResponseProcessor();
}

現在,每當我調用getResponseProcessor() ,它都不會向我返回List<String>的響應處理器。 而是返回Object的默認響應處理器。

我敢肯定,我缺少一些有關泛型的概念。 有人可以詳細解釋嗎?

編輯:實際用法是這樣的:

   public BaseRequestWithResponseProcessor<List<Dashboard>> getDashboards(Listener<List<Dashboard>> responseListener, ErrorListener errorListener) {
        String url = mBaseUrl + "/dashboard";

        ResponseProcessor<List<Dashboard>> responseProcessor = ResponseProcessorFactory.newResponseProcessor();

        AuthInfo authInfo = getAuthInfo();
        BaseRequestWithResponseProcessor<List<Dashboard>> request = new BaseRequestWithResponseProcessor<List<Dashboard>>(
                Method.GET, url, authInfo, null, responseProcessor, responseListener, errorListener);
        return request;
    }

GsonResponseProcessor構造函數中,發生了類型擦除 ,並且在運行時僅存在該方法的一個版本,類型變量T轉換為Object

在Java中,僅存在一種版本的通用方法和類,類型參數僅在編譯時存在,並且在運行時將由Object替換。

類型令牌必須使用具體的類型構造才能捕獲類型信息。 這是他們的重點,是在已知具體類型的地方捕獲類型信息。 然后可以將令牌存儲在變量中,然后用於查找對象或通過反射保留類型信息。

這里的解決方案是知道具體類型的getResponseProcessor的調用者創建類型令牌並將其作為參數傳遞。 如果在您的情況下可行,也可以傳入Class對象。 但是,如果要使用通用類作為標記,例如在List<Dashboard>示例中,則需要類型標記。

像這樣:

ResponseProcessor<List<String>> p = ResponseProcessorFactory.newResponseProcessor(new TypeToken<List<String>>() {});

您可以通過將類類型作為方法參數傳入來解決類型擦除。

public class ResponseProcessorFactory {

    public static <T> ResponseProcessor<T> newResponseProcessor(Class<T> type){
        return new GsonResponseProcessor<T>(type);
    }    
}

public class GsonResponseProcessor<T> implements ResponseProcessor<T> {

    protected T response;
    protected TypeToken typeToken;

    public GsonResponseProcessor(Class<T> type) {
        this.typeToken = TypeToken.get(type);//depends on the API version

        //this.typeToken = new TypeToken<T>(type);
        //this.typeToken = TypeToken.of(type);
    }

    @Override
    public void parse(String jsonString) throws JSONException, IOException {
            response = GsonHelper.getGsonInstance().fromJson(jsonString, typeToken.getType());
    }

    public T getResponse() {
        return response;
    }
}

您是否也嘗試過將簽名更改為正確的類型?

private ResponseProcessor<List<String>> getResponseProcessor() {
    return ResponseProcessorFactory.newResponseProcessor();
}

暫無
暫無

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

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