优点
泛型能够让我们在编译时而不是在运行时检测出错误
形式泛型类型,E、T
替换泛型类型成为泛型实例化
eg:
//定义一个只能存放String的数组列表
ArrayList<String> list = new ArrayList<>();
list.add("red");//只能添加字符串
list.add(123);//添加其他参数类型会在编译时报错,Java会把123自动包装为new Integer(123)->自动装箱(autoboxing)
注意事项
1、泛型类型必须是引用类型,不能用8大基本类型来泛型实例化(byte、short、int、long、char、boolean、float、double)
2、无须类型转换就可以从一个已指定元素类型的新型表中获取一个值。编译器已经从泛型那知道这个元素的类型了。
ArrayList<String> list = new ArrayList<>();
list.add("red");
String s = list.get(0);//no casting is needed
定义泛型类和接口
可以为类或者接口定义泛型,当实用类来创建对象,或者使用类或者接口来声明引用变量时,必须指定具体的类型
注意事项
1、泛型类可有有多个参数,用都好分隔开,例如<E1,E2,E3>
2、可以定义一个类或接口作为泛型类或者泛型接口的子类型
3、将泛型类型放在类名之后
public class String implements Comparable<String>
定义泛型方法
1、可以将静态方法定义为泛型类型
2、将泛型类型放在方法返回值之前
public static <E> void print(E[] list){
}
//调用方法时的两种方法
classname.<Integer>print(integers);
classname.print(integers);
受限的(bounded)
将泛型指定为另外一种类型的子类型,称为受限的。
<E extends student>//将E指定为student类的泛型子类型
注意事项
1、非受限泛型类型< E>等同于< E extends Object>