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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡元 中级黑马   /  2012-4-12 20:48  /  1952 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在泛型应用中如果我们自己也不确定要操作那种数据,可以用变量E来代替,
但是,我们又用<?>来表示,到底这两个又什么区别呀,还有,他们在什么情况下用
那个呀?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

5 个回复

倒序浏览
?用在 泛型限定,如:
        ArrayList<? extends E>   //可以接收 E 及 E的子类--上限限定
        ArrayList<? super E>   //可以接收 E 及 E 的父类---下限限定

而E这不过是一个随即的表示,你可以写成A,T,任意来表示,就像你定义 int x = 0 ;这个x可以是y,z。。。你任意想定义的字母。用E比较多,是因为E是elements元素一词的首字母

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
<?>: 任何类型都匹配,
以API中的Collections类为例,它的方法: reverse(List<?> list) //这边就可以接受任意类型的List集合

<E>: 当你传进来一个具体的类型时,那么这个E就只代表这个类型了
以ArrayList类为例,
ArrayList<String> list = new ArrayList<String>(); //这么写后,就是指定了E此时就是String类型了
下面,我们再要向该集合添加元素时,那就应该写成:
list.add("abc"); //添加元素的方法: boolean add(E e)

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
其实 <> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到 <> 中即可。
E 也只是一种类型的表示而已,你可以自己定义任意一种符号。
?是一个通配符,也可以理解是一个占位符,表示的是未知的那个具体的引用类型
? extends E :可以接收 E 类型或者 E 的子类型。上限。
? super E :可以接收 E 类型或者 E 的父类型。下限。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
用法楼上的都说了,我说一下区别
两个在用法上区别不是很大。
void method(List<?> list)      it = list.iterator()     ? a =it.next()  这个是不行的        
void method(List<T> list)     it = list.iterator()     T a = it.next()  这个是可以的      传什么类型就是什么
回复 使用道具 举报
1:? extends s: 可以接收E类型或者E的子类型。上限。
   ? super s: 可以接收E类型或者E的父类型。下限
   这两个代表着相似的意思,上限代表s以及下边类所有都可以,下限代表s以及上边类都可以。
   ?也代表着任意类的匹配,有时候用?并不准确,需要用上述的限定接受子类或者父类。
2:传<e>代表着,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马