定义:在编译过程中约束操作的数据类型。(统一数据类型)
格式:<数据类型>
泛型中不能写基本数据类型。
泛型类
在一个类中,某个变量的数据类型不确定时,可以定义带有泛型的类。
泛型的底层是Object类,所以调用Object来书写方法。
package test02;
import java.util.Arrays;
public class MyArrayList <E>{
Object[] obj=new Object[10];//编写Object类型的数组
int size;
//编写添加元素方法
public boolean add(E e) {
obj[size]=e;
size++;
return true;
}
//编写得到
public E get(int index) {
return (E)obj[index];
}
public String toString() {
return Arrays.toString(obj);
}
}
public class test {
public static void main(String [] args) {
MyArrayList<String> list=new MyArrayList<>();
list.add("aaa");
list.add("bbb");
String str=list.get(0);
System.out.println(str);
System.out.println(list);
}
}
泛型方法
方法中形参类型不确定时可以使用类名后面的泛型,也可以在方法申明上定义自己的泛型。
小练习:定义一个工具类:ListUtil,类中定义一个静态方法addAll,用来添加多个集合的元素。
package test02;
import java.util.ArrayList;
public class ListUtil {
public static<E> void adddAll(ArrayList<E>list,E e1,E e2,E e3) {
list.add(e1);
list.add(e2);
list.add(e3);
}
}
public class test {
public static void main(String [] args) {
ArrayList<String> list1=new ArrayList<>();
ListUtil.adddAll(list1,"aaa", "bbb", "ccc");
System.out.println(list1);
}
}
泛型接口
举例:public interface List<E>{
}
两种使用方式:实现类给出具体的类型;实现类延续泛型,创建实现类对象时再确定类型。
泛型的继承和通配符
泛型不具有继承性,但数据具有继承性。
泛型通配符:?
?extends E:可以传递E或E所有的子类类型。
? super E:可以传递E或E所有的父类类型。