Rumah  >  Soal Jawab  >  teks badan

java中在哪些情况下需要使用泛型通配符如:? extends T 或者 ? super T

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

迷茫迷茫2763 hari yang lalu783

membalas semua(2)saya akan balas

  • 阿神

    阿神2017-04-18 10:51:24

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

    balas
    0
  • PHPz

    PHPz2017-04-18 10:51:24

    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.

    balas
    0
  • Batalbalas