泛型概述
先看下面的代码:
ArrayList al1 = new ArrayList(); ArrayList al2 = new ArrayList(); al1.add("hello"); al1.add("world"); al1.add("abc"); al1.add("hello"); al1.add("1234"); al1.add("abc"); al1.add("hello"); for(int i = 0;i<al1.size();i++){ //获取每一项 String s = (String)al1.get(i); if(!al2.contains(s)){ al2.add(s); } } for (Object object : al2) { System.out.println(object); }
根据集合的用法来存取数据上面看起来很爽的样子 但是如果我们要往集合存取不一样的类型时 往集合里添加数据很方便但是 等到我们取的时候问题很多 会出现不同的类型安全的问题,为了解决这一问题 我们需要限制一个集合只能存取一种类型 这就是我们所说的泛型
虽然上面的例子取的时候可以将数据统一成 string类型 需要强转类型 因为默认从集合中取数据时返回的都是Object类型(类的鼻祖 所有的类型都继承Object类型并且里面包含了一个自动向上转型 即任何的对象都可以赋值给一个Object类型的变量 但是有个缺点是 Object类型的变量不能直接调用子类中独有的方法 可以用向下转型解决)
下面来看使用泛型的代码:
ArrayList<String> al1 = new ArrayList<>(); ArrayList<String> al2 = new ArrayList<>(); al1.add("hello"); al1.add("world"); al1.add("abc"); al1.add("hello"); al1.add("1234"); al1.add("abc"); al1.add("hello"); for(int i = 0;i<al1.size();i++){ //获取每一项 String s = al1.get(i); if(!al2.contains(s)){ al2.add(s); } } for (String s : al2) { System.out.println(s); }
总结:
1.集合默认可以存任意类型的数据,貌似功能十分强大, 存的时候很爽,取得时候问题很多 类型安全问题
2.解决的思路:限制一个集合中只能存一种类型的数据
3.泛型技术就可以限制一个集合中只能存一种类型的数据
4.怎么使用泛型
ArrayList<String> al=new ArrayList<String>();
5.使用了泛型后,在取数据的时候根本就不需要进行强制
6.泛型技术出现在JDK5
7.在JDK7的时候,推出了一种简化的写法:菱形写法
ArrayList<String> al=new ArrayList<>();
8.泛型只支持引用数据类型,对于基本数据类型要用他们的包装类
9.所有的集合类都支持泛型
泛型的底层原理
包括泛型方法、泛型类、泛型接口
不管是创建泛型方法还是泛型类还是泛型接口都需要遵循以下三点:
1、声明
2、使用
3、赋值类型