A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李云贵 中级黑马   /  2014-7-23 09:29  /  891 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型: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的父类型对象。 下限。
一般取出对象的时候用。比如比较器。

1 个回复

倒序浏览
兄弟你真是在坚持啊,哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马