JavaSE---泛型系统学习
1、概述
1.1、泛型:
允许在 定义 类、接口、方法时 使用 类型形参,这个类型形参 将在声明变量、创建对象、调用方法时 动态地指定;
1.2、jdk5后,引入了 参数化类型(允许程序在创建集合时指定集合元素的类型) 的概念;
1.3、Java的参数化类型 被称为 泛型;
1.4、jdk7之前,使用带泛型的接口,调用构造器创建对象时构造器后必须带泛型;
jdk7后,只需要带'<>'即可;
eg:
//jdk7之前 List<String> list=new ArrayList<String>();
//jdk7后 List<String> list2=new ArrayList<>();
2、自定义泛型接口、泛型类
/** * 自定义泛型类 * @param <T> element's type */ private static class Mine<T>{ //***构造器 无需加泛型 private Mine(){ } } /** * 自定义泛型接口 * @param <E> element */ private static interface My<E>{ void say(); } 使用: Mine<String> mine=new Mine<>();
3、泛型接口/类 派生子类
/** * 自定义泛型接口 * @param <E> element */ private static interface My<E>{ void say(); } /** * 泛型接口/类 派生子类 * ****泛型接口可不指定泛型类型 */ private static class Zi implements My{ @Override public void say() { } } /** * 泛型接口/类 派生子类 * ****泛型接口可指定泛型类型 */ private static class Zi2 implements My<String>{ @Override public void say() { } }
4、类型通配符
4.1、 使用 泛型类 时,都应该 为泛型类 传入一个类型实参(若没有传入类型实参,编译器会发出泛型警告);
4.2、 Java泛型设计的原则:只要代码在编译期没有出现警告,就不会遇到运行时ClassCastException;
4.3、 类型通配符: 是一个问号'?',将一个问号作为 类型实参 传入; eg:List<?>
5、设定类型通配符的上限
5.1、 有时候 不需要 作为所有类型的父类,只需要 代表某一类型的父类
/**
* 自定义泛型接口
* @param <E> element
*/
private static interface My<E>{
void say();
}
/**
* 泛型接口/类 派生子类
* ****泛型接口可不指定泛型类型
*/
private static class Zi implements My{
@Override
public void say() {
}
}
/**
* 类型通配符上限
*/
private static class A{
public void say(List<? extends Zi> list){
}
}
6、设定类型形参的上限
6.1、Java支持 在定义类型形参时设定上限;
/** * 设定 类型形参 上限(单个上限) * @param <T> */ private static class B<T extends String>{ } /** * 设定 类型形参 上限(多个上限) * @param <T> */ private static class C<T extends String & Serializable>{ }
7、自定义泛型方法
7.1、泛型方法 :
声明方法时,定义一个或多个类型形参;
7.2、语法:
修饰符 <T,S> 返回值类型 方法名(形参列表){方法体...}
7.3、与普通方法的区别:
a,多了类型形参声明;
b,类型形参使用<>,多个以','分隔,位于 修饰符与方法返回值之间;
/** * 泛型方法 */ private static class D{ private <T extends String> void say(T t){ } }
8、设定通配符的下限
8.1、super
/** * 设定 通配符 下限 */ private static class E{ private <T> void say(List<? super T> list){ } }
9、反射与泛型
9.1、jdk5后,Java为Class类增加了泛型,eg :Class<?>; 避免使用反射生成的对象需要类型强制转换;
10、泛型的优势:
1.1、编译时检测类型(避免 ClassCastException);