本帖最后由 qq771349657 于 2013-05-13 13:38:02 编辑

解决方案 »

  1.   

     子类对象也是父类对象, Student也是People,当然可以添加进去啦
      

  2.   

    Student是Person,所以add当然可以,父类引用可以指向子类实例
    addAll和add方法无本质区别但是你要是按照下面的写法就无法 add了
    ArrayList<? extends Person> al = new ArrayList<Student>();
    al.add(new Student("abc"));
    al.add(new Person("abc"));
    因为编译器不知道你add的是具体父类还是子类
      

  3.   

    元素支持多态嘛,本质上 上述泛型的add方法就是想 是想实现如下代码
     /**
     * 使用泛型为了解决类型匹配的问题
     * 必须是People 类型才能添加到List中,否则直接编译不通过
     */
    class MyList extends ArrayList<People>
    {
    @override
    public boolean add(People  p)
    {
    return add(p);
    }
    }那么将Student 作为参数调用add(People P) 方法是否成功呢?根据多态原理,当然成功了。故,ArrayList<People> 可以添加 People 类的子类的对象
      

  4.   

     
    那addAll(Collection<? extends E> c)方法中写<? extends E>和写<E>岂不是没有分别了 ,如果<E>可以传入E和E的子类类型
      

  5.   

    这个显然是多态的原理,你Student继承了Person,其实泛型有这种写法,
    上限(上边界):ArrayList<? extends Number> al = new ArrayList<Integer>();  正确这句话的意思是说,是Number的子类,包含Number自己, 也就是说,你再不济也得是Number
    最多你也就到Number了,和Number的儿子们。ArrayList<? extends Number> al = new ArrayList<String>();  错误
    原因:Number的儿子们中包括Number自己,都没有你String这吗个东西。
    下限(下边界):ArrayList<? super Integer> al = new ArrayList<Number>();  正确
    这句话是说,是Integer的父类,包含Integer自己,也就是说,最低也得是Integer,
    或者是他的 爸爸,爷爷们。ArrayList<? super Integer> al = new ArrayList<Byte>();      错误
    原因:Byte既不是Integer的爸爸,也不是Integer的爷爷,更不是Integer自己,他是Inetger的兄弟,
    所以错误。
    Lz要理解多态 男人继承人 你给List规定里面必须是人  那么 男人自然也可以装到集合里
      

  6.   


    http://mysun.iteye.com/blog/851925
      

  7.   


    这样吧API中的addAll(Collection<? extends E> c)方法定义的时候,定义成addAll(Collection<E> c)
    两个效果是一样的麽,
      

  8.   

    不一样。
    因为Collection<Integer> 并不是Collection<Object> 的子类。