Java中的泛型(Generic)

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>();//可以的,因为下边界是String
list.add(new Number());//可以的,因为已经确定了下边界.但是这时不能使用String身上的具体方法,只能使用Object身上的方法.因为泛型下边界定义为String,不知道具体会实现称为什么样的类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值