79.泛型
传统方法的问题:
-
不能对加入到集合的ArrayList中的数据类型进行约束(不安全)
-
遍历的时候,需要进行类型转换,如果集合中的数据量较大,对效率有影响
泛型:
-
当我们 ArrayList<Dog> 表示存放到 ArrayList 集合中的元素是Dog类型
-
如果编译器发现添加的类型,不满足要求,就会报错
-
在遍历的时候,可以直接取出 Dog 类型而不是 Object
-
编译时,检查元素的添加,提高了安全性
-
减少了类型转换的次数,提高效率
-
public class ArrayList<E> {} E称为泛型,那么Dog->E
不使用泛型:Dog->加入->Object->取出->Dog //放入到ArrayList会先转成Object,在取出时,还需要转换成Dog
使用泛型:Dog->加入->Dog->取出->Dog //放入时和取出时,不需要类型转换,提高效率
泛型介绍:
-
泛型又称参数化类型,是JDK5.0出现的新特征,解决数据类型的安全性问题
-
在类声明或实例化时只要指定好需要的具体的类型即可
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCaastException异常。同时,代码更简洁、健壮
-
泛型的作用是:可以在类声明时通过一个标识表示某个属性的类型,或者是某个方法的返回值的类型,或者是参数类型
//泛型的作用是:可以在类声明时期通过一个标识表示类中某个属性的类型
//或者是某个方法的返回值的类型,或者是参数类型
class Person<E> {
E s;//E表示 s 的数据类型,该数据类型在定义Person对象的时候指定,即在编译期间,就确定E是什么类型
public Person(E s){//E也可以是参数类型
this.s = s;
}
public E f(){//返回类型使用E
return s;
}
public void t(){
System.out,println(s.getClass()); //显示s的运行类型
}
}
泛型的实例化:
要在类名后面指定类型参数的值。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
泛型使用细节:
-
interface List<T>{} , public class HashSet<E>{}..等等,T,E只能说引用类型,不能是基本数据类型
-
在指定泛型具体类型后,可以传入该类型或其子类类型
-
泛型使用形式
List<Integer>list1 = new ArrayList<Integer>(); List<Integer>list2 = new ArrayList<>(); //若以下情况,默认给它的泛型是<E> E就是Object List list3 = new ArrayList();