哪位高手能解释一下<? extends Object>是什么意思,为什么用了它以后List不能用ADD方法了,
List<? extends Object> list=new ArrayList();

解决方案 »

  1.   

    给个链接给你看看,应该理解了这个也理解了范型。
    http://gdluckyzhang.javaeye.com/blog/247938
      

  2.   

    <? extends Object>意思是你传入的对象的范围,如果你的写成List<Date> date = new List<Date>();
    则表示你传入的是Date对象,你也可以传入其它对象。但是在添加的时候只能添加你传入的对象。
      

  3.   

    用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类
      

  4.   

    但List <? extends Object> list=new ArrayList();
    list.add("aa");这样就会报错呀,难到String不是Object的子类
      

  5.   

    我想你误解了我的意思,我并不是不了解泛型,而是对List <? extends Object> list=new ArrayList();
    list.add("aa");
    里的<? extends Object>不了理解,为什么用了这个后LIST不能ADD了
      

  6.   

    这个肯定是有错误了,
    <? extends Object> 就像接口编程 你从里面读数据是没有关系的,
    但是你现在是add  list却找到不到自己的类型,因为你继承的是 object类,
    你插入的可能是各种类型
      

  7.   

    List <? extends Object> list=new ArrayList();
    我的理解是:你写这句就表示java无法确定你的list存放的有可能是?,也有可能是Object,所有无法确定具体的。
    你可以换种方式啊,比如写个方法:
    public void addList(List <? extends Object> list)
    {
       list.add();
    }
    在调用这个方式时的list参数肯定是确定的。
      

  8.   


    List<? extends Object> list = new ArrayList();
    list.add(new Object());/*
    The method add(capture#1-of ? extends Object) in the type List<capture#1-of ? extends Object> is not applicable for the arguments (Object)这个问题很有意思,当使用add方法添加任意对象比如Object,出现了以上编译错误。"?extends Object"是限制泛型的一种用法,本质上应该这样表示任何Object的子类都可以加入这个List,而使用了泛型的List所有方法比如add都要在编译器检查类型的正确性,之前定义在<>之中的类型就是编译检查参照的标准,可是这里在编译add时编译器发现参照标准类型无法确定下来,任何类都是继承自Object,到底以谁为参照标准呢?
    */
      

  9.   

    最主要的是在往LIST里ADD时到底是做了什么样的工作,让它即使add(new Object())都会报错
      

  10.   


    List <String> list=new ArrayList<String>();
    就只能保存String类型的数据了.
      

  11.   

    好像各位对这种通配符的类型不甚了解噢,在这种出现<? extends SuperClass>参数类型的时候,编译器只知道它是SuperClass类型的一个子类型,这个类型不知道是什么类型,?类型不能用于匹配具体类型,编译器会拒绝传入任何参数,不允许调用set方法。
    这种通配符只适用于返回参数,即get方法,因为编译器知道它是SuperClass的类型,只要是SuperClass或者父类型的引用都可以接受类型。
    与其正好相反的是<? super ChildClass>,这个通配符类型编译器只能调用set方法,不可以调用get方法,即只能传入参数不可返回参数,因为编译器知道?类型一定是ChildClass的子类,所以可以传入任何ChildClass的子类,但是编译器不知道?的最高引用是哪个类型,所以只能用Object引用来接收类型。
      

  12.   

    当然还有一个更脆弱的类型就是<?>类型,这个类型通常用处不是很大,编译器完全不知道它是什么类型,所以既不可以调用set方法,get方法也只能用Object引用来接收。
      

  13.   

    确实有底层代码有关系
    想想
    编译器确实不知道是什么类型的
    因为任何类都Object的子类
    这和泛型要求的有点像违背了
      

  14.   

    <? extends Object>任意继承自object的子类
      

  15.   

    基本就是如此,put就是用<? super T>,get就是用<? extends T>,如果既要put,又要get就不要使用通配符。