java泛型的学习总结
泛型是java SE 1.5的新特性,泛型的本质是参数化类型,即对要操作的参数指定其类型,它的作用是提供了程
序的类型安全,同时提供了向后兼容的特性,在集合类中遇到的较多。类型参数可以用在类上、方法上和接口
上,就是常听说的泛型类、泛型方法了。
泛型的主要作用体现在集合框架的使用中,比如,当向Map集合中放入对象时,原则上允许你放入任意类型的对
象,但通常情况是,我们指定特定的map,然后向其中添加特定的类型的对象,在不指定类型时,调用 get 方
法时,返回object 对象,于是我们还要手动的进行类型转换,已得到预期的结果,这将存在一个隐患,有可能
会抛出ClassCastException 异常。有了泛型,我们就不需要为此而苦恼,不仅可以省去强制类型转换的工作,
同时还可以检查录入结果时是否出错。泛型给我们带来的好处有以下几点:1、类型安全;2、消除强制类型转
换;3、潜在的性能收益。
在java中泛型转换存在这样的事实:
--虚拟机中没有泛型,只有普通的类和方法;
--所有的类型参数都是它们的边界替换;
--桥方法被合成,为了保持多态
--为保持类型安全,在必要的时候还是要插入强制类型转换
泛型在使用时存在一些限制和规则:
1、不能用类型参数替换基本类型,即没有Pair(double),只有Pair(Double)
2、运行时的类型查询只产生原始类型
3、无论何时使用instanceof 或涉及泛型类型的强制转换表达式,都会有编译警告
4、泛型不能扩展Throwable
5、不能声明参数化类型的数组
在使用泛型类的时候,还要考虑继承规则。比如说A 和B 两者之间存在继承的关系,但 Pair<A> 和 Pair<B>
之间却没有任何继承关系。不过泛型类可以扩展其他泛型类,如 ArrayList<T> 实现 List<T> 接口。
有时候,需要对类型变量进行限制,如 T extends boundType,将类型变量限定为绑定类型的子类型,可以有
多个限定,之间用&号分割。
固定的泛型类型也许不能达到灵活运用的本质,于是java泛型中提供了通配符类型,如:?extends boundType
,将类型限制为绑定类型的子类型。通配符限定与类型变量限定十分相似,不过他还有附加的功能,即超类型
限定,如:? super boundType,将其限制为绑定类型的父类。