请问:
List<? extends Fruit> flist = new ArrayList<Apple>();
flist.add(new Apple());
这为什么报错呢 
另外“ArrayList<?> 类型是 ArrayList<T> 的超类型” 这句话是不是说反了
请详细讲讲这个泛型通配符的用法和限制 我看了许多博客 但看的不怎么明白
谢谢

解决方案 »

  1.   

    带通配符的泛型集合不能使用add方法.
    <? extends Fruit>这种用法一般是用于处理多态的时候
    比如:
    public void show(List<? extends Fruit> fruit){             for(Fruit s :fruit){               //操作              }   }
    这种情况下是可以的。
    但是集合操作情况下不允许这样。
      

  2.   

    List <Apple> flist = new ArrayList <Apple>(); 
    flist.add(new Apple());
    这样可以!
    通配符的泛型则不可以的!
    如2楼,主要用于处理多态应用! 
      

  3.   

    这个语句错误了。List <? extends Fruit> flist = new ArrayList <Apple>();
    泛型在声明(List <? extends Fruit> flist)和定义(new ArrayList <Apple>())的时候泛型类型必须一致。否则是不能通过编译的。下面这个语句是可以的flist.add(new Apple());,因为在声明 List 是指定了该链表中装的对象是Fruit的子类,所以是可以的。
      

  4.   

    其实上面的语句是错误的,add操作才是不能通过编译。
      

  5.   

    写错了,上面的new语句可以通过,add操作才会出问题。
      

  6.   

    new语句可以通过
    ...
    调用add  报错!
      

  7.   

    真确解答:          List<? extends Fruit>可以以合法地指向一个List<Apple>.一旦执行这种类型的向上转型,你就将丢失丢向其中传递任何对象的能力,甚至是传递Object也不行
      

  8.   

    这个语句明显是有问题的,泛型一般不能这么定义,这是个相当于死角List<? extends Fruit> flist = new ArrayList<Apple>();
    flist.add(new Apple());
    ? extends Fruit> 表示类型是 Fruit的子类。但是这个子类没有明确的界限。java不能确定最低的子类。flist.add 这里的add只能添加 最低的子类的 子类,所以这个根本 没法 做,我也只能这么说明了,说不清啊。
    目前这种flist只能添加null。
    可以这样定义
    List<? super Fruit> flist = new ArrayList<Fruit或者其父类>();
    flist.add(new Apple());
    就没有问题了。