Maison > Questions et réponses > le corps du texte
至于什么是泛型通配符,我是知道的,但是不知道具体在项目里的使用场景,比如哪些情况下,我们创建的类或者接口需要用到泛型通配符呢
阿神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>
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.