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

© ccyznhy 中级黑马   /  2013-8-26 17:06  /  1630 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-8-27 22:14 编辑

public static void printCollection(Collection<Object> cols){
                for(Object obj:cols){
                        System.out.println(obj);
                }
                cols.add("String");//没错
                //cols=new HashSet<Date>();//会报告错误?
        }
        public static void printCollection1(Collection<?> cols){
                for(Object obj:cols){
                        System.out.println(obj);
                }
                //cols.add("String");//错误,因为它不知自己未来匹配就一定是String。
                cols.size();//没错
                cols=new HashSet<Date>();//会报告错误?
        }
}
?通配符的作用一直不太懂,希望各路大神通过代码解决,

评分

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

查看全部评分

5 个回复

倒序浏览
你这个代码不全不好整吧。   
对于你说的泛型中的通配符,是这样的:它这样写 <?> 意思是还没有确定类型,你可以给集合里面加随便哪种对象,但是如果<>里面确定了具体类型,就只能王集合里添加这种确定的对象。
回复 使用道具 举报
Collection<Object> cols=new HashSet<Date>();
==》你只要记住:类型参数是不涉及到继承关系的。也就是左边的类型参数是<Object>的,而右边<Date>所以会报错

评分

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

查看全部评分

回复 使用道具 举报
cols属于Collection<Object>类型,而你通过new HashSet<Date>()得到的是 HashSet<Date>类型,HashSet<Date>并不属于Collection<Object>类或其子类,所以会报告错误

当使用通配符"?"时,元素类型可以匹配任何类型,类型是不确定的。 但是因为程序不知道cols集合里元素的类型,所以不能向其中添加对象。但有一种例外就是null,它是所有引用类型的实例

祝编程愉快!

评分

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

查看全部评分

回复 使用道具 举报
  1. public static void printCollection(Collection<Object> cols){
  2.                         for(Object obj:cols){
  3.                                 System.out.println(obj);
  4.                         }
  5.                         cols.add("String");//没错
  6.                         //cols=new HashSet<Date>();//会报告错误?
  7.                         //你这个函数参数中的集合已指定了泛型,因此再新建一个新的对象泛型不同是不可以的,
  8.                         //记住泛型是不存在子父类的继承关系的
  9.                 }
  10.                 public static void printCollection1(Collection<?> cols){
  11.                         for(Object obj:cols){
  12.                                 System.out.println(obj);
  13.                         }
  14.                         //cols.add("String");//错误,因为它不知自己未来匹配就一定是String。
  15.                         /*这里报错是因为,你传入的参数没泛型是一个通配符,也就是说你也不知道今后需要传入
  16.                                                    什么参数,因此如果你使用添加方法就不合理,比如说我调用你的方法,传入一个数字类型
  17.                                                    那么你这个添加String 类型的方法虚拟机就疯了。*/
  18.                         cols.size();//没错
  19.                         cols=new HashSet<Date>();//会报告错误?
  20.                         //这里不会报错
  21.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
通告的是Object。你new hashset定义的就是Date。你知道小范围String不能适用Object。Date就不是小范围了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马