1、什么是泛型
参数化类型,将原有的具体类型参数化,适用于多种数据类型执行相同的代码,避免了强制类型的转换(类型擦除)
可以将泛型理解为一种代码模板,可以用一套代码套用各种类型
2、泛型类
举个栗子
// 此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
// 在实例化泛型类时,必须指定T的具体类型
public class Cup<T> {
// key这个成员变量的类型为T,T的类型由外部指定
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public static void main(String[] args) {
Cup<Student> cup1 = new Cup<Student>();
cup1.setData(new Student());
System.out.println(cup1.getData());
Cup<Teacher> cup2 = new Cup();
}
}
我们常接触的集合框架也是一种泛型类(Lsit、Set、Map)
List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
System.out.println(item);
}
3、泛型方法
public class Test {
public <T> void printArray(T[] arr) {
for (T element : arr) {
System.out.printf("%s ", element);
}
System.out.println();
}
public static void main(String[] args) {
// 类型只能为引用类型
Integer[] arrA = { 1, 2, 3, 4, 5 };
Double[] arrB = { 1.0, 2.0, 3.0, 4.0, 5.0 };
Test test = new Test();
test.printArray(arrA);
test.printArray(arrB);
}
}
public class TestArray {
// 打印
public static void printArray1(Object[] array) {
// 类型擦除
for (Object i : array) {
System.out.println(i + " ");
}
}
public <T> void printArray2(T[] array) {
for (T t : array) {
System.out.println(t + " ");
}
}
public static void main(String[] args) {
Integer[] nums = {1, 2, 3};
String[] names = {"tom", "jerry", "kitty"};
Student[] students = {
new Student("tom"),
new Student("jerry"),
new Student("kitty")
};
new TestArray().printArray2(students);
printArray1(nums);
printArray1(names);
}
}