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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李柯 中级黑马   /  2012-4-23 19:29  /  2217 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在看泛型视频时,总好像感觉通配符?与T用法一样?

谁能不能给解释一下二者的应用或区别?谢谢!

2 个回复

倒序浏览
<T extends A> void test(List<T> list);

void test(List<? extends A> list);

<T extends A> void test(List<T> list);表示List里面装的某一类型.

void test(List<? extends A> list);表示里面是任一类型.

区别就是某一类型是确定的,通配符只能调用与参数类型无关的方法,而T类型可以调用与参数类型相关的方法。

<T extends A> void test(List<T> list); 这种方式,是在方法前先定义了一个类型T,T继承自A,List<T> list,list中的元素必须是T类型的,也就是说,list中的元素类型要一样。void test(List<? extends A> list); 这种方式,是指list中只要放入A的子类型的就行了,但是一个非final类的子类是可以有很多个的,所以用这种方式时,list中的元素类型是可以不相同的,只要它们都是A的子类型就行了。
回复 使用道具 举报
举个例子:List<T extends A>和List<? extends A>
这是List中的元素类型的范围问题:
List<T extends A>其实就是List<T>, List中的元素只能是T的一个对象。
List<? extends A>定义的变量包含的元素可以是A的对象,也可以是A的子类的对象。
比如:
class A{}
class B extends A{}
class T extends B{}
可以定义List<T> list1= new ArrayList();
list1.add(new T());  list1.add(new T()); list1.add(new T());  //List中现在有三个元素。
list1.add(new A());     //这种用法不正确
另 List<? extends A> list2 = new ArrayList();
list2.add(new A());   list2.add(new B());   list2.add(new T());   //List中也有三个元素,用法是正确的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马