泛型的引入
集合中可以存放任意对象,只要把对象存储集合后,那么这时他们都会被提升成Object类型。
当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。比如下面程序:
public class GenericDemo {
public static void main(String[] args) {
List list = new ArrayList();
list.add("abc");
list.add("itcast");
list.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
//相当于:Object obj=new Integer(5);
Iterator it = list.iterator();
while(it.hasNext()){
//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
String str = (String) it.next();
//String str=(String)obj;
//编译时期仅检查语法错误,String是Object的儿子可以向下转型
//运行时期String str=(String)(new Integer(5))
//String与Integer没有父子关系所以转换失败
//程序在运行时发生了问题java.lang.ClassCastException
System.out.println(str.length());
}
}
}
泛型定义
JDK1.5 出现新的安全机制,保证程序的安全性
泛型: 指明了集合中存储数据的类型 <数据类型>
如果指明,在存储list.add(5)时出现编译错误
有了泛型才可以使用增强for循环,从而减少代码量
java中的泛型是伪泛型,因为只在编译时体现,class文件中没有泛型。(据说C++是真泛型)
ArrayList叫做带有泛型的类,其中 E 是一个变量,用来接受数据类型。
因此:泛型实现将运行时期的ClassCastException,转移到了编译时期变成了编译失败,避免了类型强转的麻烦。
泛型通配符:?
public class GenericDemo {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();
HashSet<Integer> set = new HashSet<Integer>();
array.add("123");
array.add("456");
set.add(789);
set.add(890);
iterator(array);
iterator(set);
}
/*
* 定义方法,可以同时迭代2个集合
*/
public static void iterator(Collection<?> coll){
Iterator<?> it = coll.iterator();
while(it.hasNext()){
//it.next()获取的是object类型
System.out.println(it.next());
}
}
}