Java中的泛型(Generic)
来源:互联网 发布:centos 升级python 编辑:程序博客网 时间:2024/05/29 19:07
JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题.例如:
ArrayList list = new ArrayList();list.add("abc");Integer num = (Integer)list.get(0);//运行时出错,但编码时发现不了list.add(new Random());list.add(new ArrayList());for(int i=0;i<list.size();i++){ (?)list.get(i);//这里取出的对象应该转换成什么类型}
1.集合泛型:在没有泛型之前,集合中存入的数据,类型就会丢掉,在取出数据时,需要做强制类型转换,就有转换的风险.而这种风险,在编译阶段是没有办法检查出来的.引入泛型之后,在定义集合的过程中可以指定集合中存储的类型,当存入非这种类型的数据时,编译时会报错,取出数据时也不需要强转:
List list = new ArrayList();
泛型的基本术语,以ArrayList为例: <>念着为typeof
·ArrayList中的E称为类型参数变量
·ArrayList中的Integer称为实际参数类型
·整个称为ArrayList泛型类型
·整个ArrayList称为参数化的类型ParameterizedType
如果两边都有泛型,则要求泛型必须一致,也可以只有一边有而另一边没有
ArrayList list = new ArrayList();
ArrayList list = new ArrayList();
ArrayList list = new ArrayList ();//–考虑兼容1.5之前的老程序
ArrayList list = new ArrayList();
2.自定义泛型
方法类型:定义在方法上的泛型叫做方法泛型,作用的范围的当前方法内部
泛型在使用之前必须先定义,其中的字母可以是任意字母,但是通常都是大写字母
可以认为,当方法在被调用到时,虚拟机自动判断出泛型的具体类型.
public static <T> void doxx(T t){} public <T> T getSome(){}
类上的泛型:定义在类上的泛型叫做类泛型,作用范围是整个类中都可以使用
public class GenericDao<T>{}
可以认为,在使用这个类时,就需要指定出泛型的具体类型.如果不确定,则泛型是它的上边界类型的. 静态方法不能使用类上定义的泛型,如果想使用泛型静态方法必须自己定义泛型.
*泛型通配符
因为泛型没有继承关系,所以当需要用一个泛型引用不同的泛型实现时,泛型中他们的的共同的父类是不可以的.这时候,就引入了一个新的概念,叫做泛型通配符?.注意泛型通配符只能用在泛型引用中,用来引用不同的泛型实现,不能出现在实现中.
List<?> list = null;list = new ArrayList<String>();list = new ArrayList<Integer>();
*泛型的边界:
如果没有指定泛型默认可以接受任意类型,有时希望进一步限制,此时可以使用泛型的边界:
extends - 用来指定泛型的上边界,使用在泛型的通配符和泛型定义中,指定具体的泛型实现必须是指定的类或其子类.
坏处是:在传入对象时,只能传入null.
好处是:在获取到泛型的对象时,可以调用上边界的方法.
super - 用来指定泛型的下边界,使用在泛型的通配符中,指定具体的泛型实现必须是指定类或者超类.下边界不能使用在类泛型上
好处是:传入对象时,可以传入下边界的子孙类对象
坏处是:获取到泛型对象时,只能调用Object身上的方法.
例:
List<? extends Object> list = null;list = new ArrayList<String>();//这是可以的,因为String是上边界的子类list.add(null);//只能增加null,因为上边界给定的是Object,那么具体不管加入什么类型,在最后转换的时候都可能出错.只有null是任何类的子类
List<? super Integer> list = null;list = new ArrayList<Number>();//可以的,因为下边界是Stringlist.add(new Number());//可以的,因为已经确定了下边界.但是这时不能使用String身上的具体方法,只能使用Object身上的方法.因为泛型下边界定义为String,不知道具体会实现称为什么样的类型
- Java中的泛型(Generic)
- Java中的泛型(Generic)
- java 中的泛型 generic(未完成)
- java generic super/extends (java 泛型中的super/extends)
- Java中的泛型编程(generic programming)和泛型类(generic class)
- java之泛型(Generic)
- java之泛型(Generic)
- 泛型爪哇(Generic Java)
- Java 的泛型程序设计( Generic Programing)
- 泛型参数Generic
- Core Java (十九) 泛型程序设计(Generic parogramming)
- Java特性之泛型(Generic Types)
- 黑马程序员Java学习笔记之泛型Generic
- Java generic
- Java Generic
- java Generic
- Java Generic
- 泛型方法Generic Method
- mac 下终端访问文件出现“Permission Denied”解决方案
- AIX网络管理
- Android Studio project消失,project被清空
- listview gridview采用setAdapter后如何精确恢复之前的位置
- ava web开发 高并发处理
- Java中的泛型(Generic)
- mongodb 学习笔记 02 -- CURD操作
- hdu 1811 拓扑排序+并查集
- Java基础——Statement与PrepareStatement
- 仅仅是来自深夜的想法
- 数据结构与算法——希尔排序(Java实现)
- 循环广告位组件的实现
- 【ios开发学习 - 第五课】UITableView使用
- 对于两个月培训学习java与javaweb的心得,学习之路:说的少做的多胜过说的多做的少的