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

发布于 2022-09-04 15:09:35 字数 69 浏览 10 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太阳哥哥 2022-09-11 15:09:35

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

此生挚爱伱 2022-09-11 15:09:35

我不写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请求返回的结果都会带有一个 codemsg 等一些通用的参数来表示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.java

public 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的角度来讲,而泛型通配符的意义就在于此了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文