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

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

迷茫
迷茫

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

répondre à tous(2)
阿神

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>

PHPzhong

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal