源码是这样的:
import java.util.*;
class Fluit{}
class Apple extends Fluit{}
public class Generics {

public static void main(String[] args){
@SuppressWarnings("unused")
List<? extends Fluit> flist=new ArrayList<Apple>();
flist.add(new Apple());
}
}
然后   flist.add()方法内不可加任何的对象   包托Object   仅能添加null  请大神解释其原理 ~!泛型通配符

解决方案 »

  1.   

    这个就是泛型的好处,List<? extends Fluit>这里已经规定以了,只能想list中添加Fluit的子类的实例。这样做的好处是我通过list.get(i)的时候返回的对象不用就是Fluit累的一个实例,不用我强转就可以直接使用Fluit类中的相关属性好方法。
      

  2.   

    new ArrayList<Apple>()
    如上面所说,List<? extends Fluit>规定了list中添加的对象需要满足的一个条件,即必须是Fluit子类的实例,而new ArrayList<Apple>()这里就具体的实例化了一个ArrayList对象,并且指定了具体的子类类型Apple,应为Apple是Fluit的一个子类,所以就可以想list中添加
      

  3.   

    亲~ 我特地翻了下书, 你添加不了就说明有编译错误, 其实IDE误导了你 你编译错误是出现在List<? extends Fluit> flist=new ArrayList<Apple>();这行代码本身就是错的, 但为了解释清楚,其实可以理解为 List<Fluit> flist=new ArrayList<Apple>(); 
       在对象中  Fluit fluit = new Apple(); 这样子是莫有错的,对象的多态性么。
       但是 在泛型中这样子是绝对不可以的, ,引用书本上的例子: List<Fluit> 和 ArrayList<Apple> 分别代表 水果和苹果,假如你去买水果,肯定是只买各种水果中的一部份,List<? extends Fluit> flist=new ArrayList<Apple>(); 就相当于购买了全部的水果,这个违背常识么
       还有,泛型的作用就是检查数据类型,,,,和new()什么的 没一毛钱关系哦
      

  4.   

    弄明白了,  我和楼上几位理解不同,   我是这么认为的:
    List<? extends Fluit> 表示任何从Fluit导出的类,  然后 ArrayList<Apple>这个泛型在实际的运行时 Apple的所有类型信息会被擦除掉 JVM不确定这个类   也就无从得知其是否从Fluit中导出了. 所以flist无法添加任何非null的对象