泛型:jdk1.5出现的安全机制。
之所以叫泛型,是因为<>内可以定义各种对象类型,甚至包括自定义的类Person。
好处:
1,将运行时期的问题ClassCastException转到了编译时期。
2,避免了强制转换的麻烦。
<>用处:当操作的引用数据类型不确定的时候。就使用<>。将要操作的引用数据类型传入即可.
其实<>就是一个用于接收具体引用数据类型的参数范围。
在程序中,只要用到了带有<>的类或者接口,就要明确传入的具体引用数据类型 。
泛型技术是给编译器使用的技术,用于编译时期。确保了类型的安全。
运行时,会将泛型去掉,生成的class文件中是不带泛型的,这个称为泛型的擦除。
为什么擦除呢?因为为了兼容运行的类加载器。
泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不用使用者在强制转换了。
ArrayList al = new ArrayList();
al.add("abc");//public boolean add(Object obj)
al.add("hahah");
al.add(4);//al.add(new Integer(4));jkd1.5自动装箱。编译通过,运行时报错ClassCastException
Iterator it = al.iterator();
while(it.hasNext()){
String str = (String)it.next();//强制转换为String类型对象
System.out.println(str);
}
}
--------------------------
ArrayList al = new ArrayList();//泛型String类型,构造函数也一定加上。
al.add("abc");//public boolean add(Object obj)
al.add("hahah");
al.add(4);//al.add(new Integer(4));jkd1.5自动装箱。编译时就能报错无法int转为string
Iterator it = al.iterator();//迭代器也声明为泛型String类型
while(it.hasNext()){
String str = it.next();//迭代器内都为String类型对象,不需要强制转换
System.out.println(str);
}
}
--------------------------
TreeSet ts = new TreeSet(new ComparatorByName());自定义Person类。
泛型的通配符:? 未知类型。
泛型的限定:
? extends E: 接收E类型或者E的子类型对象。上限
一般存储对象的时候用上限。因为这样取出都是按照上限类型来运算的。不会出现类型安全隐患。
? super E: 接收E类型或者E的父类型对象。 下限。
一般取出对象的时候用。比如比较器。
|
|