掌握Java SE的泛型原理
使用泛型集合API操纵对象数据
1.什么是泛型:
整个称为ArrayList<E>泛型类型
ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<>念typeof
ArrayList称为原始类型
2.参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告,例如,Collection<String> c = new Vector;
原始类型可以引用一个参数化类型的对象,编译报告警告,例如,Collection c = new Vector<String>();
3.如果类的实例对象中的多处都要用到同一个泛型参数,即这些地方引用的泛型类型要保持同一个实际类型时,
这时候就要采用泛型类型的方式进行定义,也就是类级别的泛型,语法格式如下:
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getById(int id){}
}
4.类级别的泛型是根据引用该类名时指定的类型信息来参数化类型变量的,例如,如下两种方式都可以:
GenericDao<String> dao = null;
new genericDao<String>();
注意:
在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
当一个变量被声明为泛型时,只能被实例变量、方法和内部类调用,而不能被静态变量和静态方法调用。
因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的类型参数。
public void Test4(){ List list=new ArrayList(); Student st1=new Student("tt"); Student st2=new Student("tty"); Student st3=new Student("yy"); list.add(st1); list.add(st2); list.add(st3); for (Object obj:list) { System.out.println(list); } for (Object obj:list){ System.out.println(((Student)obj).getName()); } } @Test public void Test5(){ List<Student> list=new ArrayList<Student>(); Student st=new Student(); Student st1=new Student("tt"); Student st2=new Student("tty"); Student st3=new Student("yy"); list.add(st1); list.add(st2); list.add(st3); for (Student obj:list) { System.out.println(obj.getName()); }
public class Student { private int id; private String name; private int gender;//0-女 1-男 public Student(){ } public Student(String name){ this.name=name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getGender() { return gender; } public void setGender(int gender) { this.gender = gender; } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", gender=" + gender + '}'; } }
心得:
自信使我们快乐,自信使我们敢于挑战自我,自信使我们获得快乐,自信使我们拥有勇气。