日期:2014-05-20  浏览次数:20682 次

有关集合框架泛型的问题
本帖最后由 qq771349657 于 2013-05-13 13:38:02 编辑

import java.util.*;
import java.util.Comparator;

public class Noname1 {

/**
 * @param args
 */
public static void main(String[] args) {
////元素为People的ArrayList集合
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
Iterator<Person> it = al.iterator();

while(it.hasNext())
{
System.out.println(it.next().getName());
}

ArrayList<Student> al1 = new ArrayList<Student>();//元素为Student的ArrayList集合
al1.add(new Student("abc--1"));
al1.add(new Student("abc--2"));
al1.add(new Student("abc--3"));

Iterator<Student> it1 = al1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next().getName());
}

System.out.println(al.addAll(al1));//true

Iterator<Person> it2= al.iterator();
while(it2.hasNext())
{
System.out.println(it2.next().getName());
/*打印abc1
      abc2
      abc3
      abc--1
      abc--2
      abc--3
                         */
}
System.out.println("-----");
al.add(new Student("abc--4"));

it2= al.iterator();
while(it2.hasNext())
{
System.out.println(it2.next().getName());
/*打印abc1
              abc2
      abc3
      abc--1
      abc--2
      abc--3
      abc--4*/
}

}

}
class Person{
private String name;
Person(String name){
this.name=name;
}
public String getName(){
return name;
}
}
class Student extends Person{
Student(String name){
super(name);
}
}
class Comp implements Comparator<Person>{
public int compare(Person s1,Person s2){
return s1.getName().compareTo(s2.getName());
}
}

有两个问题想不太明白 
第一个ArrayList已经指定类型为People
1.48行add方法可以add子类类型
2.addAll方法可以添加第二个ArrayList集合中所有Student元素
泛型中应该没有多态这一说吧
泛型 IT

------解决方案--------------------
Student是Person,所以add当然可以,父类引用可以指向子类实例
addAll和add方法无本质区别

但是你要是按照下面的写法就无法 add了
ArrayList<? extends Person> al = new ArrayList<Student>();
al.add(new Student("abc"));