java中在哪些情况下需要使用泛型通配符如:? extends T 或者 ? super T
问题描述
至于什么是泛型通配符,我是知道的,但是不知道具体在项目里的使用场景,比如哪些情况下,我们创建的类或者接口需要用到泛型通配符呢
问题解答
回答1:记住 Effective Java 一书中的这句话:Producer Extends, Consumer Super 。这里讲得很详细:http://stackoverflow.com/ques...
补充
TreeMap有个构造函数:
public TreeMap(Comparator<? super K> comparator);
可以想想为什么要指定类型Comparator<? super K>,而不是Comparator<K>或Comparator<? extends K>?
回答2:我不写Java,但所有的泛型都是相通的。正好我此时在看淘宝OPEN的SDK,这是一个最好来解释泛型通配符最好的真实示例了。
我特意找了一份Java版本的SDK,见: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 ;
所有API请求都是通过 execute 来操作的,而这个方法就采用的 ? extends T 通配符上界,来限制返回的对象必须是 TaobaoResponse 的子类。
简单点说就是约束。
那从淘宝SDK的角度来看,通配符上界最大的价值是淘宝所有SDK请求返回的结果都会带有一个 code、msg 等一些通用的参数来表示API的请求状态。
那好,我们回过头来看 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; }}
注意到这里的 catch 体中 localResponse,他的类型 T,但这个T并不是简单的一个Object对象,由于前面已经限定 T 的类型必须是 TaobaoResponse 的子类。
那就意味者,当对 T 进行实例后,其类型至少是 TaobaoResponse 的子类,而对于 TaobaoResponse 的定义是这样的:
-- url: https://github.com/ggd543/taobao-sdk-java/blob/master/src/main/java/com/taobao/api/TaobaoResponse.javapublic abstract class TaobaoResponse implements Serializable { private static final long serialVersionUID = 5014379068811962022L; @ApiField('code') private String errorCode; @ApiField('msg') private String msg; // more}
因此你可以直接看到这样的代码:
localResponse.setErrorCode(e.getErrCode());
瞧,是不是很有意思,所有通用参数都可以统一进行处理。
那么从淘宝SDK的角度来讲,而泛型通配符的意义就在于此了。
相关文章:
1. java - bin目录有什么特殊含义吗?为什么可执行文件都放在bin目录?2. Docker for Mac 创建的dnsmasq容器连不上/不工作的问题3. Python 3.5,斐波数列, a,b = 0,14. javascript - webpack less文件单独打包出错5. PHP5.5.38.0 Apache2.4.23.0服务崩溃 系统日志php_curl.dll模块报6. 怎么php怎么通过数组显示sql查询结果呢,查询结果有多条,如图。我要forsearch里面echo7. python - Push Notification推送服务在手机上测试时候无法收到生产环境的推送8. python - django 项目的 migrations 目录是否应该提交到 git9. java - 如何求多叉树两个任意节点的最短路径呢?10. javascript - UglifyJsPlugin打包的时候把css html也压缩了

网公网安备