Maison  >  Questions et réponses  >  le corps du texte

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

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

迷茫迷茫2712 Il y a quelques jours738

répondre à tous(2)je répondrai

  • 阿神

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

    Souvenez-vous de cette phrase du livre Effective Java : Producer Extends, Consumer Super.
    C'est expliqué en détail ici : http://stackoverflow.com/ques...

    Supplément

    TreeMap a un constructeur :

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

    Vous pouvez réfléchir à la raison pour laquelle vous devez spécifier le type Comparator<? super K> au lieu de Comparator<K>

    répondre
    0
  • PHPz

    PHPz2017-04-18 10:51:24

    Je n'écris pas Java, mais tous les génériques sont interopérables. Il se trouve que je regardais le SDK de Taobao OPEN à ce moment-là. C'est le meilleur exemple réel pour expliquer les caractères génériques.

    J'ai spécialement trouvé une version Java du SDK, voir : 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 ;

    Toutes les requêtes API sont traitées via execute, et cette méthode utilise la limite supérieure du caractère générique ? extends T pour limiter l'objet renvoyé à une sous-classe de TaobaoResponse.

    Pour faire simple, c'est une contrainte.

    Du point de vue du SDK Taobao, la plus grande valeur de la limite supérieure générique est que les résultats renvoyés par toutes les requêtes du SDK Taobao auront des paramètres communs tels que code et msg pour indiquer l'état de la requête de l'API. .

    D'accord, revenons en arrière et regardons l'implémentation spécifique de 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;
        }
    }

    Notez que catch dans le corps ici a localResponse et son type est T, mais ce T n'est pas un simple objet Object, car le type de T doit être un sous-enfant de TaobaoResponse gentil.

    Cela signifie que lorsque T est instancié, son type est au moins une sous-classe de TaobaoResponse, et la définition de TaobaoResponse est comme ceci :

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

    Vous pouvez donc voir directement le code comme celui-ci :

    localResponse.setErrorCode(e.getErrCode());

    Écoutez, n'est-ce pas intéressant ? Tous les paramètres courants peuvent être traités uniformément.

    Donc, du point de vue du SDK Taobao, c'est la signification des caractères génériques.

    répondre
    0
  • Annulerrépondre