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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H07000223 中级黑马   /  2012-3-11 11:02  /  1704 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型中Object与通配符?的区别

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

3 个回复

正序浏览
本帖最后由 baypm_jy 于 2012-3-11 13:19 编辑

首先Object类是所有类的父类,它在java.lang.Object包下,可参照官方API文档查阅
如:假设有Person类
   List<Person>  person=new ArrayList<Person>(); 这里表示有这么样的一个集合,它只接收Person这种类型的数据

如果想换成其它的也可
  List<?> list=new ArrayList<Object>();   代表这么样的一个集合,它是接收任意数据类型的一个集合,它可以是Object,也可是String,也可以是Map对象
如:List<Map<String,String>> list=new ArrayList<Map<String,String>>(); 等,在Android的适配器里面就有用到。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
比如public void say(Person<Object> per){}
那么只能接收Person<Object> per=new Person<Object>()这种类型Person,
泛型中没有继承这种概念,所以不能接收Person<String > per=new Person<String>(),如果要接收任意的参数类型,就应该用
public void say(Person<?>per){}
?是通配符,代表任意.

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 冯旭君 于 2012-3-11 11:32 编辑

泛型中Object的即表示所有的类型,而通配符?并不一定是什么类(当然是Object类型,因为java的单根继承,这里只是说明一个相对比Object类具体的类型),就是用通配符来充当一个类型填充上此位置来保证代码的完整性和可读性。
//这是从AbstractList类中截取的一段代码
例如:
public boolean addAll(Collection<? extends E> c) {
        return addAll(size, c);
    }
这里的?号就是一种类型,是E的子类。用Object显然是不对的。由于java中的多态型E的子类很多又想让E的子类都能传递进去,但又不想其他类传进去,必须要用一个符号表示,所以通配符就出现了。

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

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