泛型 1.5版本特性
优点:1、将运行时期的错误转移到了编译时期(有利于程序员第一时间发现)
2、省去了强转的麻烦
3、去除了黄色的提示
ArrayList list = new ArrayList();
list.add("abc");
list.add(123);
list.add(newPerson("lisi",21));
Interator it =list.iterator();
while(it.hasNext()){
Person p = (Person)it.next() //会报类型转换错误
System.out.println(p.getName());
}
泛型注意:
1、泛型的前面和后面的数据类型必须一致
2、后面的数据类型可以不写,如果不写,叫做菱形泛型(1,7版特性)
3、如果泛型定义成Object(可以但)是没有意义的,所有类型都可以是Object
4、集合的泛型声明成一种引用数据类型,这个集合可以存储这种类型对象
和这种类型的子类型对象(比如 Person类型,person的子类Student也
是可以的)(泛型不能是基本数据类型)
LinkedList<String>list = new LinkedList<String>();
LinkedList<Person>list = new LinkedList<>(); //第二个泛型可以不写
list.add( newStudent("张三",23)); // Student类继承了Person类 (父类引用指
// 向子类对象)
public <T>void print(T t){ //可以写但没意义不如写成Object
}
public voidprint(Object obj){
}
public static voidmethod(Q q){ //报错静态随着类的加载而加载,没创建对
//象但Q需要对象才能识别,所以会报错
//
System.out.println(q);
}
高级泛型
<?> // ?泛型的通配符当不确定后面的数据类型时,可以将前面的泛型定义成?
List<String> l1 =new linkedList<>()
? extends E 固定上边界
ArrayList<Person>list = new ArrayList<>();
list1.add(newPersong("张三",23));
list1.add(newPersong("张三1",24));
ArrayList<Student>list1 = new ArrayList<>();
list2.add(newPersong("张三2",25));
list2.add(newPersong("张三3",28));
list1.addAll(list2); // 对的父类引用指向子类对象
list2.addAll(list1); //错的,子类引用不能指向父类对象
静态方法不能用泛型