泛型
2015-10-10 14:16
232 查看
泛型简介:
泛型是在Java JDK1.5出现的一种安全机制。它的作用是在定义集合时指定向集合中添加的数据类型,而不能添加指定类型之外的类型。当泛型给javac编译器提供集合时,会去掉“类型”信息,保证了运行效率。也正因为编译生成的字节码会去掉泛型的类型信息,因此我们只要能跳过编译器,就可以往泛型集合中加入其它类型的数据,如用反射得到集合,再调用add方法即可。
泛型格式:
向< >中添加需要操作的引用数据类型
如:TreeSet<String> 就是将存入集合的元素指定为String类型
泛型术语:
例如:ArrayList<E>类和ArrayList<Integer>
1、ArrayList<E>整体称为泛型类型;
2、ArrayList<E>中的E称为类型变量或类型参数;
3、整个ArrayList<Integer>称为参数化类型;
4、ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数;
5、ArrayList<Integer>中的< >称为typeof;
6、ArrayList称为原始类型。
泛型好处:
1、泛型可以将集合中的元素限定为一个特定类型,使得集合中只能存储同一类型的对象;这样我们就把运行时出现的ClassCastException(类型转换不兼容异常)转移到了编译时期,让运行时期问题减少,提高了安全性。
2、当从集合中获取一个对象时,编译器也可知道这个对象的类型,不需要对对象进行强制转化,更加方便。
什么时候用泛型?
通常在集合框架中很常见,只要见到< >就要定义泛型,< >用来接收类型,将集合中要存储的数据类型作为参数传递到< >中即可。
参数化类型与原始类型:
1、参数化类型与原始类型的兼容性
1)参数化类型可以引用一个原始类型的对象,编译期间会报警告,但是能否通过编译,要看编译器。
如:Collection<String> coll = new Date();
2)原始类型可以引用一个参数化类型的对象,编译期间会报警告。
如:Collection coll = new Vector<String>();
2、参数的类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Objec>();//错
Vector<Objec> v = new Vector<String>();//错
3、在创建数组实例时,数组的元素不能使用参数化的类型:
如:Vector<Integer> v[] = newVector<Integer>[10];//错
对于同一范围内同类事物,可以通过泛型限定的方式定义,有两种方式:
1、? extends E:可接收E类型或E类型的子类型。
如:Vector<? extends Number> x = newvector<Integer>();
2、? super E:可接收E类型或E类型的父类型。
如:Vector<? super Integer>x = newvector<Number>();
泛型是在Java JDK1.5出现的一种安全机制。它的作用是在定义集合时指定向集合中添加的数据类型,而不能添加指定类型之外的类型。当泛型给javac编译器提供集合时,会去掉“类型”信息,保证了运行效率。也正因为编译生成的字节码会去掉泛型的类型信息,因此我们只要能跳过编译器,就可以往泛型集合中加入其它类型的数据,如用反射得到集合,再调用add方法即可。
泛型格式:
向< >中添加需要操作的引用数据类型
如:TreeSet<String> 就是将存入集合的元素指定为String类型
泛型术语:
例如:ArrayList<E>类和ArrayList<Integer>
1、ArrayList<E>整体称为泛型类型;
2、ArrayList<E>中的E称为类型变量或类型参数;
3、整个ArrayList<Integer>称为参数化类型;
4、ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数;
5、ArrayList<Integer>中的< >称为typeof;
6、ArrayList称为原始类型。
泛型好处:
1、泛型可以将集合中的元素限定为一个特定类型,使得集合中只能存储同一类型的对象;这样我们就把运行时出现的ClassCastException(类型转换不兼容异常)转移到了编译时期,让运行时期问题减少,提高了安全性。
2、当从集合中获取一个对象时,编译器也可知道这个对象的类型,不需要对对象进行强制转化,更加方便。
什么时候用泛型?
通常在集合框架中很常见,只要见到< >就要定义泛型,< >用来接收类型,将集合中要存储的数据类型作为参数传递到< >中即可。
参数化类型与原始类型:
1、参数化类型与原始类型的兼容性
1)参数化类型可以引用一个原始类型的对象,编译期间会报警告,但是能否通过编译,要看编译器。
如:Collection<String> coll = new Date();
2)原始类型可以引用一个参数化类型的对象,编译期间会报警告。
如:Collection coll = new Vector<String>();
2、参数的类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Objec>();//错
Vector<Objec> v = new Vector<String>();//错
3、在创建数组实例时,数组的元素不能使用参数化的类型:
如:Vector<Integer> v[] = newVector<Integer>[10];//错
对于同一范围内同类事物,可以通过泛型限定的方式定义,有两种方式:
1、? extends E:可接收E类型或E类型的子类型。
如:Vector<? extends Number> x = newvector<Integer>();
2、? super E:可接收E类型或E类型的父类型。
如:Vector<? super Integer>x = newvector<Number>();
相关文章推荐
- 笔记13 winform
- PHP 开发中的外围资源性能分析(二)
- 毛玻璃效果demo
- android WebView与JS交互小结
- 139端口的开放信息
- MySQL5.6-内存占用配置方法
- 如何营销
- 那一场邂逅
- qq互联(connect.qq.com)取用户信息的方法
- adb shell error
- 数据库事务隔离级别
- 为什么 Chrome 会说你的 SHA-2 证书链是“肯定不安全的”
- php将base 64数据转化为图片并保存
- Java模式(适配器模式)
- 让Service变成杀不死的小强,浅谈如何实现不死的服务
- 第十一届浙江省省赛题(未补完)
- PHP简单Socket编程
- Jersey入门例子
- js工具收集汇总
- mysql配置文件my.cnf详解