一、什么是泛型
定义类、接口、方法的时候想要传递任意类型,按照以往的情况可以把类型设置成Object,但这样可能会出现类型装换异常,为了解决这个问题所以出现了泛型,就是在定义时定义类型变量,作为参数传递。
注意:类型变量建议使用大写字母一般使用E、T、K、V
二、定义泛型
定义泛型类
- 定义
// 修饰符+class+类名<类型变量>
public class MyArrayList<T> {
private final ArrayList<T> list = new ArrayList<>();
public boolean add(T t){
return list.add(t);
}
public boolean remove(T t){
return list.remove(t);
}
@Override
public String toString() {
return list.toString();
}
}
- 使用
public class GenericsDome01 {
public static void main(String[] args) {
// 在使用过程中把String作为参数传递给MyArrayList,里面的T代表String
MyArrayList<String> list = new MyArrayList<>();
list.add("岳不群");
list.add("令狐冲");
list.add("林平之");
list.remove("令狐冲");
System.out.println(list);
}
}
定义泛型接口
// 修饰符+class+类名<类型变量>
public interface TestGenericsClass<T> {
}
定义泛型方法
public static <T> T sum(T[] arr) {
return null;
}
三、其他
通配符和上下限
使用‘?’代替,可以代替一切类型
public class GenericDemo2 {
public static void main(String[] args) {
// 需求:要求所有的汽车可以一起参与比赛。
ArrayList<BJD> bjds = new ArrayList<>();
bjds.add(new BJD());
bjds.add(new BJD());
bjds.add(new BJD());
go(bjds);
ArrayList<MZD> mzds = new ArrayList<>();
mzds.add(new MZD());
mzds.add(new MZD());
mzds.add(new MZD());
go(mzds);
// 虽然BJD和MZD是Car的子类,但是 ArrayList<BJD> ArrayList<MZD> 和 ArrayList<Car>没有半毛钱关系。
// Java提供了一个语法:泛型通配符:其实就是“?”,可以在使用泛型的时候代表一切类型。
// Java提供了泛型上下限,约束?的具体类型。
// ? extends Car : 上限: ? 必须是Car的子类,顶多是Car
// ? super Car : 下限: ? 必须是Car的父类,至少是Car
// ArrayList<Dog> dogs = new ArrayList<>();
// dogs.add(new Dog());
// dogs.add(new Dog());
// dogs.add(new Dog());
// go(dogs);
}
public static void go(ArrayList<? extends Car> cars){
}
}
class Car{}
class BJD extends Car{}
class MZD extends Car{}
class Dog{}