java集合框架之泛型
2017-06-24 23:23
204 查看
1.为什么需要使用泛型
1):存储任意类型的数据在集合中 ,但是取出来都是Object类型的,此时就得强转.2):约束存储到集合中的元素必须是相同的数据类型(相同的数据类型才能做比较,比如TreeSet类).
3):设计一个点(Point)类,来封装坐标位置,要求坐标位置支持String类型.Integer类型/Double类型.
非常不优雅的设计,如下图(重复定义):
2.什么是泛型
泛型(GenericType),从Java5开始支持的新的语法:什么是泛型:
1):广泛通用的类型.
2):代码模板中类型不确定,谁调用该段代码,谁指明类型是什么.
3.泛型类
直接在类/接口上定义的泛型.使用泛型:
保证前后类型相同. List<String> list = new ArrayList<String>();//该List集合中只能存储String类型的元素.
因为前后类型相同,所以从Java7开始,推出泛型的菱形语法<>.即List<String> list = new ArrayList<>();
泛型不存在继承的关系(错误如下).
List<Object> list = new ArrayList<String>();//错误的
从此以后,使用集合都得使用泛型来约束该集合中元素的类型.
public class Point<T> { private T x; private T y; public T getX() { return x; } public void setX(T x) { this.x = x; } public T getY() { return y; } public void setY(T y) { this.y = y; } } class Test{ public static void main(String[] args) { //情况1:使用String类型 Point<String> p1 = new Point<String>(); String x = p1.getX(); //情况2:使用Integer类型 Point<Integer> p2 = new Point<Integer>(); Integer x2 = p2.getX(); } }通过反编译,发现:泛型其实也是语法糖,底层依然没有泛型,而且依然使用强转.
2.泛型方法
在方法上声明泛型.情况1):泛型类中的泛型只能适用于非静态方法,如果需要给静态方法设置泛型,此时使用泛型方法:
情况2):泛型类中的泛型应该适用于整个类中多个方法,有时候只对某一个方法设置泛型即可.
-----------------------------------------------------
一般的,把自定义的泛型作为该方法的返回类型才有意义,而且此时的泛型必须是由参数设置进来的.
如果没有参数来设置泛型的具体类型,此时的方法一般返回设计为Object即可.
3.泛型的通配符和上限和下限:
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知,通配符.此时只能接受数据,不能往该集合中存储数据.
泛型的上限和下限:用来限定元素的类型必须是X类的子类或相同, X的父类或相同.
4.泛型擦除和转换
泛型的擦除:1):泛型编译之后就消失了(泛型自动擦除);
2):当把带有泛型的集合赋给不带泛型的集合,此时泛型被擦除(手动擦除).
堆污染:
单一个方法既使用泛型的时候也使用可变参数,此时容易导致堆污染问题.
如:在Arrays类中的asList方法: public static <T> List<T> asList(T... a).
相关文章推荐
- Java集合框架上机练习题(泛型1)
- 黑马程序员 Java集合框架 Map和泛型
- Java集合框架中的泛型有什么优点
- Java集合框架上机练习题(泛型、JFrame)用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- Java集合框架之泛型
- Java集合框架(三)之泛型详解
- 黑马程序员_java集合框架与泛型详解
- java集合框架---泛型设计和出现
- Java集合框架上机练习题(泛型1)
- Java集合框架之_泛型
- Java集合框架3(泛型集合)
- java集合框架(泛型)
- Java集合框架 泛型
- Java集合框架3(泛型集合)
- Java集合框架上机练习题(泛型、JFrame)
- java集合框架(泛型限定)
- 第十五周作业Java集合框架-泛型
- java集合框架---泛型总结
- Java集合框架和泛型机制
- java集合框架--泛型