A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马志军 中级黑马   /  2012-12-31 12:57  /  3116 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马志军 于 2013-1-2 09:43 编辑

比如boolean addAll(Collection<? extends E> c)
  boolean <T extends E> addAll(Collection<T> c)
说第一种比第二种好,API文档里用的就是第一种,但为什么?感觉都一样
是不是说方法体里面没用到那个类型,都用通配符“?”?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 冉世友 于 2012-12-31 13:45 编辑

个人感觉哈,写了T就写死了,只能用T了,不能在用其他的了

如果写的是?,除了用T,还可以是其它的子类。

比如说,List<? extends List > l = new List<? extends List > ();
则l里面可以添加ArrayList和LinkList的对象啊
写定了T只能是T了

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
?指的是不确定的一个类型,T表达的是一个确定的类型。虽然我们定义时  T我们可以指定,   就我的理解,?表意更准确。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 高一航 于 2012-12-31 14:25 编辑

boolean addAll(Collection<? extends E> c)
有界通配符(一些有趣的 “? extends T” 通用类型说明符)是语言提供的一种工具,用来处理协变性缺乏 — 有界通配符允许类声明方法参数或返回值何时具有协变性(或相反,声明方法参数或返回值何时具有逆变性(contravariant))。虽然了解何时使用有界通配符是泛型较为复杂的方面,但是,使用有界通配符的压力通常都落在库作者的身上,而非库用户。最常见的有界通配符错误就是忘记使用它们,这就限制了类的使用,或是强制用户不得不重用现有的类。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
<? extends E>表示可以传入父类E或者它的子类 <E super ?>表示可以传入子类E和它的父类,这样定义是很方便的
回复 使用道具 举报
第一种:除了用E,还可以是E的子类,保证其健壮性。
第二种: 就是T了,这相当于硬编码。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
王玮 发表于 2012-12-31 15:20
第一种:除了用E,还可以是E的子类,保证其健壮性。
第二种: 就是T了,这相当于硬编码。

T就是E的子类啊
回复 使用道具 举报
王玮 中级黑马 2012-12-31 16:22:46
8#
本帖最后由 王玮 于 2012-12-31 16:56 编辑
马志军 发表于 2012-12-31 15:25
T就是E的子类啊


<? extends Collection> 是引用的时候用的
<T extends Collection>是定义的时候用的

这是ArralyLis的  public boolean addAll(Collection<? extends E> c)方法
/**
     * Appends all of the elements in the specified collection to the end of
     * this list, in the order that they are returned by the
     * specified collection's Iterator.  The behavior of this operation is
     * undefined if the specified collection is modified while the operation
     * is in progress.  (This implies that the behavior of this call is
     * undefined if the specified collection is this list, and this
     * list is nonempty.)
     *
     * @param c collection containing elements to be added to this list
     * @return <tt>true</tt> if this list changed as a result of the call
     * @throws NullPointerException if the specified collection is null
     */
    public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();
        int numNew = a.length;
        ensureCapacity(size + numNew);  // Increments modCount
        System.arraycopy(a, 0, elementData, size, numNew);
        size += numNew;
        return numNew != 0;
    }

回复 使用道具 举报
王玮 中级黑马 2012-12-31 16:38:35
9#

上面的源码 中 只使用了c,而自定义泛型时会使用到 E

本帖最后由 王玮 于 2012-12-31 16:56 编辑

static <E> void swap(E[] a,int i,int j ){
E t= a;
a = a[j];
a[j] = t;
}
===============================
这下把
<? extends E> 使用 引用时  
<T extednds E> 使用定义时 给解释清楚了吧·····

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马