ArrayList<Animal> al = new Arraylist<>();
al.add(new Animal());
al.add(new Dog());
al.add(new Cat());
如果不写泛型,类型默认是Object。
二、泛型的使用
泛型可以在很多地方进行定义。
定义在类后面,称之为泛型类。
定义在方法上面,称之为泛型方法。
定义在接口后面,称之为泛型接口。
1.泛型类
在定义一个类的时候,某个变量的数据类型不确定时,就可以使用带有泛型的类。
格式:
修饰符 class 类名<类型>{
}
例:
public class ArrayList<E>{
}
此处E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写成T、E、K、V等
具体使用:
泛型类的书写:
java复制代码
import java.util.Arrays;
public class MyArrayList <E>{
Object[] obj = new Object[10];
int size;
public boolean add(E e){
obj[size] = e;
size++;
return true;
}
public E get(int index){return (E)obj[index];}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
泛型类的使用:
java复制代码
public class GenericsTest02 {
public static void main(String[] args) {
MyArrayList<String> mal = new MyArrayList<>();
mal.add("张三");
mal.add("李四");
mal.add("王五");
System.out.println(mal);
}
}
运行结果:
2.泛型方法
方法中形参类型不确定时,
可以使用类名后面定义的泛型,所有类中的方法都可以使用这个泛型。
也可以在方法声明上定义自己的泛型,仅在声明的这个方法中可以使用。
格式:
修饰符<类型> 返回值类型 方法名(类型 变量名){
}
举例:
public<T> boolean get(T t){
}
定义一个泛型方法:
java复制代码
public final class ListUtils {
private ListUtils(){}
public static<E> void addAll(ArrayList<E> al, E e1, E e2, E e3){
al.add(e1);
al.add(e2);
al.add(e3);
}
}
拓展:上面的addAll方法只能添加确定个数的元素,但是我不确定要添加的元素,应该如何实现?
java复制代码
public final class ListUtils {
private ListUtils(){}
public static <E> void addAll(ArrayList<E> al, E...e){
for (E e1 : e) {
al.add(e1);
}
}
}