1、背景
JAVA推出泛型之前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常
2、概念
JAVA泛型是JDK5引入的一个新特性,泛型提供了编译时类型安全监测机构,该机制允许我们在编译时检测到非法的类型数据结构,泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数
3、好处
- 能够保证类型安全
- 消除了类型的强制转换是
4、类型
- E-Element (在集合中使用,因为集合中存放的是元素)
- T-Type (表示java类,包括基本的类和我们自定义的类)
- K-Key (表示键,例如map中的key)
- V-Value (表示值,例如map中的value)
- N-Number (表示数值类型)
- ? - (通配符表示不确定的java类型)
1、泛型类
a 、使用语法为 类型<具体的数据类型> 对象名=new 类名<具体的数据类型>
b、 java1.7以后,后面的具体类型可以省略不写
ArrayListdataList=new ArrayList<>();
2、泛型类的注意事项
- 泛型类如果没有指定具体的数据类型,此时操作的数据类型是Object
- 泛型类的类型参数只能是类类型,不能是基本数据类型
- 泛型类再逻辑上可以看成不同的类型,但实际上都是相同类型
Generic
strGeneric=new Generic<>(); Generic intGeneric=new Generic<>(); strGeneric.getClass()==intGeneric.getClass(); 结果是true
可以结合类型擦除进行理解,泛型参数后都是Generic
3、从泛型类派生子类
- 子类也是泛型类,子类要和父类的泛型类型一致 class ChildGenric
extends Generic - 子类不是泛型类,父类要明确泛型的数据类型
4、泛型接口
泛型接口的定义语法
interface 接口名称<泛型标识,泛型标识......>{
泛型标识 方法名;
...........
}
5、泛型接口的使用
实现类也是泛型类,实现类要泛型接口的泛型类型一致
//泛型接口 public interface Generic{ T getKey(); } //泛型类实现泛型接口 public class Pair implements Generic { private T key; private V value; //构造方法 public Pair(T key,V value){ this.key=key; this.value=value; } @Override public T getKey(){ return key; } public V getValue(){ return value; } }
实现类不是泛型类,接口要明确泛型类型
public class Apple implements Generic三、泛型方法{ public String getKey(){ return "hello" } }
1、用法
泛型是指在调用方法的时候指明泛型的具体类型
2、语法
修饰符
publicT getType(ArrayList tList){ return tList.get(0); }
3、说明
- public 与返回值中间的
非常重要,可以理解为此方法为泛型方法 - 只有声明了的方法是泛型方法,泛型类中使用了泛型的成员方法不是泛型方法
表明该方法是使用泛型理性是T 此时才可以在方法中使用泛型类型T - 与泛型类的定义一样,此处的T可以随便写成任意标识,常见的如K,V等形式的参数常用于表示泛型
4、泛型方法与可变参数
publicvoid print(E... e){ for(E e1: e){ System.out.println(e); } }
5、泛型方法总结
- 泛型方法使方法独立于类而产生变化
- 如果statistic方法要使用泛型的能力必须是其成为泛型方法
1、什么是类型通配符
- 类型通配符一般是使用?代替具体的类型实参
- 类型通配符是类型实参,而不是类型形参
2、类型通配符的上限
语法: 类/接口 extends 实参类型>
要求该泛型的类型只能是实参类型或者实参类型的子类类型
3 类型通配符的下限
语法: 类/接口 super 实参类型>
要求该泛型的类型,只能是实参类型,或实参类型的父类类型



