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

至于什么是泛型通配符,我是知道的,但是不知道具体在项目里的使用场景,比如哪些情况下,我们创建的类或者接口需要用到泛型通配符呢

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

membalas semua(2)
阿神

Ingat ayat ini daripada buku Jawa Berkesan: Producer Extends, Consumer Super.
Ia diterangkan secara terperinci di sini: http://stackoverflow.com/ques...

Suplemen

TreeMap mempunyai pembina:

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

Anda boleh fikirkan mengapa anda perlu menentukan jenis Comparator<?

PHPzhong

Saya tidak menulis Java, tetapi semua generik boleh dikendalikan. Saya kebetulan melihat SDK Taobao OPEN pada masa ini. Ini adalah contoh sebenar terbaik untuk menerangkan kad bebas generik.

Saya menjumpai versi Java SDK khas, lihat: https://github.com/ggd543/tao...

-- url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoClient.java
/**
     * 执行TOP公开API请求。
     * @param <T>
     * @param request 具体的TOP请求
     * @return
     * @throws ApiException
     */
public <T extends TaobaoResponse> T execute(TaobaoRequest<T> request) throws ApiException ;

Semua permintaan API dikendalikan melalui execute, dan kaedah ini menggunakan ? extends T sempadan atas kad bebas untuk mengehadkan objek yang dikembalikan kepada subkelas TaobaoResponse.

Ringkasnya, ia adalah satu kekangan.

Dari perspektif SDK Taobao, nilai terbesar bagi sempadan atas kad bebas ialah hasil yang dikembalikan oleh semua permintaan SDK Taobao akan mempunyai beberapa parameter biasa seperti code dan msg untuk menunjukkan status permintaan API .

Baiklah, mari kita kembali dan lihat pelaksanaan khusus execute:

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;
    }
}

Perhatikan bahawa catch dalam badan di sini mempunyai localResponse dan jenisnya ialah T, tetapi T ini bukan objek Objek yang mudah, kerana jenis T mestilah sub-anak TaobaoResponse baik hati.

Ini bermakna apabila T dijadikan instantiated, jenisnya sekurang-kurangnya subkelas TaobaoResponse dan takrifan TaobaoResponse adalah seperti ini:

--  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
}

Jadi anda boleh terus melihat kod seperti ini:

localResponse.setErrorCode(e.getErrCode());

Lihat, bukankah ia menarik? Semua parameter biasa boleh diproses secara seragam.

Jadi dari perspektif Taobao SDK, ini ialah maksud kad bebas generik.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan