赞
踩
List list = new ArrayList();//默认类型是Object list.add("A123"); list.add("B234"); list.add("C345"); System.out.println(list); for(int i=0;i<list.size();i++){ //若要将list中的元素赋给String变量,需要进行类型转换,不然会报Incompatible types错误,显示list.get(i)返回的是Object String str = (String) list.get(i); System.out.println(str); } list.add(123); //因为类型是Object,我们可以把Integer类型或者其他数据类型的元素也加入list之中 System.out.println(list.get(3)); for(int i=0;i<list.size();i++){ //String str = (String) list.get(i); //但是在这里会报错java.lang.ClassCastException,我们不能直接将Integer类型的数据转换成String System.out.println(list.get(i).getClass()); }
如代码中所示,当我们定义了一个List,list默认的类型是所有对象的基类Object,那么我们取出数据的时候需要经过一次类型转换才能进行对象的实际类型的相关操作。因为List中的类型是Object,那么我们先添加了String类型的数据,然后再添加Integer或者其他类型的数据也是允许的,因为编译时List中是Object类型的数据,然而运行的时候却是它本身的类型,所以当我们将List中的数据当作String处理时会抛出java.lang.ClassCastException
。
那么有没有什么办法可以使集合能够记住集合内元素各类型,且能够达到只要编译时不出现问题,运行时就不会出现java.lang.ClassCastException
异常呢?答案就是使用泛型。
Java泛型设计原则是:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常。
泛型,即“参数化类型”,把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊类型,把<数据类型>当作是参数一样传递。
相关术语:
ArrayList中的E称为类型参数变量
ArrayList中的Integer称为实际类型参数
整个称为ArrayList泛型类型
整个ArrayList称为参数化的类型ParameterizedType
泛型的作用:
代码更加简洁【不用强制转换】
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。