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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秦超 中级黑马   /  2012-4-27 22:18  /  2476 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在泛型中,通配符 ?的作用是代表任意类型,自定义泛型 T也是代表任意类型,这两个有什么区别?求详解,感谢了!

5 个回复

倒序浏览
?是一个占位符,当传入参数是不确定的类型时使用,T是传入指定的一种类型
回复 使用道具 举报
楼上正解!
回复 使用道具 举报
假设有一个类A,以下两个方法有什么区别

<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的子类型就行了。
其实你说的二者在本质上并没有太大的区别,都可以存储任意类型的数据。

评分

参与人数 3技术分 +1 黑马币 +10 收起 理由
职业规划-刘倩老师 + 1
乔玉吉 + 5 赞一个!
秦超 + 5

查看全部评分

回复 使用道具 举报
小鹿叙鹿 发表于 2012-4-28 00:04
假设有一个类A,以下两个方法有什么区别

void test(List list);

得解!谢了
回复 使用道具 举报
小鹿叙鹿 发表于 2012-4-28 00:04
假设有一个类A,以下两个方法有什么区别

void test(List list);

我对这个也是有点迷惑,终于明白了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马