黑马程序员技术交流社区

标题: 集合-.泛型 [打印本页]

作者: 李云贵    时间: 2014-7-23 09:29
标题: 集合-.泛型
泛型: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的父类型对象。 下限。
一般取出对象的时候用。比如比较器。


作者: 曾翀    时间: 2014-7-23 09:39
兄弟你真是在坚持啊,哈哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2