黑马程序员技术交流社区

标题: 泛型通配符问题 [打印本页]

作者: 胡元    时间: 2012-4-12 20:48
标题: 泛型通配符问题
在泛型应用中如果我们自己也不确定要操作那种数据,可以用变量E来代替,
但是,我们又用<?>来表示,到底这两个又什么区别呀,还有,他们在什么情况下用
那个呀?

作者: 石好强    时间: 2012-4-12 21:10
?用在 泛型限定,如:
        ArrayList<? extends E>   //可以接收 E 及 E的子类--上限限定
        ArrayList<? super E>   //可以接收 E 及 E 的父类---下限限定

而E这不过是一个随即的表示,你可以写成A,T,任意来表示,就像你定义 int x = 0 ;这个x可以是y,z。。。你任意想定义的字母。用E比较多,是因为E是elements元素一词的首字母
作者: 刘基军    时间: 2012-4-12 22:43
<?>: 任何类型都匹配,
以API中的Collections类为例,它的方法: reverse(List<?> list) //这边就可以接受任意类型的List集合

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

作者: 黄长利    时间: 2012-4-12 22:50
其实 <> 就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到 <> 中即可。
E 也只是一种类型的表示而已,你可以自己定义任意一种符号。
?是一个通配符,也可以理解是一个占位符,表示的是未知的那个具体的引用类型
? extends E :可以接收 E 类型或者 E 的子类型。上限。
? super E :可以接收 E 类型或者 E 的父类型。下限。
作者: 贠(yun)靖    时间: 2012-4-12 22:53
用法楼上的都说了,我说一下区别
两个在用法上区别不是很大。
void method(List<?> list)      it = list.iterator()     ? a =it.next()  这个是不行的        
void method(List<T> list)     it = list.iterator()     T a = it.next()  这个是可以的      传什么类型就是什么

作者: 马强    时间: 2012-4-12 23:01
1:? extends s: 可以接收E类型或者E的子类型。上限。
   ? super s: 可以接收E类型或者E的父类型。下限
   这两个代表着相似的意思,上限代表s以及下边类所有都可以,下限代表s以及上边类都可以。
   ?也代表着任意类的匹配,有时候用?并不准确,需要用上述的限定接受子类或者父类。
2:传<e>代表着,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2