亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

java中在哪些情況下需要使用泛型通配符如:? extends T 或者 ? super T
迷茫
迷茫 2017-04-18 10:49:24
0
2
912

至于什么是泛型通配符,我是知道的,但是不知道具體在項(xiàng)目里的使用場(chǎng)景,比如哪些情況下,我們創(chuàng)建的類(lèi)或者接口需要用到泛型通配符呢

迷茫
迷茫

業(yè)精于勤,荒于嬉;行成于思,毀于隨。

全部回復(fù)(2)
阿神

記住 Effective Java 一書(shū)中的這句話:Producer Extends, Consumer Super 。
這里講得很詳細(xì):http://stackoverflow.com/ques...

補(bǔ)充

TreeMap有個(gè)構(gòu)造函數(shù):

public TreeMap(Comparator<? super K> comparator);

可以想想為什么要指定類(lèi)型Comparator<? super K>,而不是Comparator<K>或Comparator<? extends K>?

PHPzhong

我不寫(xiě)Java,但所有的泛型都是相通的。正好我此時(shí)在看淘寶OPEN的SDK,這是一個(gè)最好來(lái)解釋泛型通配符最好的真實(shí)示例了。

我特意找了一份Java版本的SDK,見(jiàn):https://github.com/ggd543/tao...

-- url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoClient.java
/**
     * 執(zhí)行TOP公開(kāi)API請(qǐng)求。
     * @param <T>
     * @param request 具體的TOP請(qǐng)求
     * @return
     * @throws ApiException
     */
public <T extends TaobaoResponse> T execute(TaobaoRequest<T> request) throws ApiException ;

所有API請(qǐng)求都是通過(guò) execute 來(lái)操作的,而這個(gè)方法就采用的 ? extends T 通配符上界,來(lái)限制返回的對(duì)象必須是 TaobaoResponse 的子類(lèi)。

簡(jiǎn)單點(diǎn)說(shuō)就是約束。

那從淘寶SDK的角度來(lái)看,通配符上界最大的價(jià)值是淘寶所有SDK請(qǐng)求返回的結(jié)果都會(huì)帶有一個(gè) codemsg 等一些通用的參數(shù)來(lái)表示API的請(qǐng)求狀態(tài)。

那好,我們回過(guò)頭來(lái)看 execute 的具體實(shí)現(xiàn):

if(this.needCheckRequest==true){
    try{
        request.check();//if check failed,will throw ApiRuleException.
    }catch(ApiRuleException e){
        T localResponse=null;
        try {
            localResponse=request.getResponseClass().newInstance();
        } catch (InstantiationException e2) {
            throw new ApiException(e2);
        } catch (IllegalAccessException e3) {
            throw new ApiException(e3);
        }
        localResponse.setErrorCode(e.getErrCode());
        localResponse.setMsg(e.getErrMsg());
        //localResponse.setBody("this.");
        return localResponse;
    }
}

注意到這里的 catch 體中 localResponse,他的類(lèi)型 T,但這個(gè)T并不是簡(jiǎn)單的一個(gè)Object對(duì)象,由于前面已經(jīng)限定 T 的類(lèi)型必須是 TaobaoResponse 的子類(lèi)。

那就意味者,當(dāng)對(duì) T 進(jìn)行實(shí)例后,其類(lèi)型至少是 TaobaoResponse 的子類(lèi),而對(duì)于 TaobaoResponse 的定義是這樣的:

--  url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoResponse.java

public abstract class TaobaoResponse implements Serializable {

    private static final long serialVersionUID = 5014379068811962022L;

    @ApiField("code")
    private String errorCode;

    @ApiField("msg")
    private String msg;

    // more
}

因此你可以直接看到這樣的代碼:

localResponse.setErrorCode(e.getErrCode());

瞧,是不是很有意思,所有通用參數(shù)都可以統(tǒng)一進(jìn)行處理。

那么從淘寶SDK的角度來(lái)講,而泛型通配符的意義就在于此了。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板