一:认识泛型
概述:
定义类,接口,方法时,同时声明了一个或者多个类型变量(如:<E>) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。
语法:
泛型类 修饰符 class 类名<类型变量,类型变量,…> {}
泛型接口 修饰符 interface 接口名<类型变量,类型变量,…> {}
泛型方法 修饰符 <类型变量,类型变量,…> 返回值类型 方法名(形参列表) {}
作用:
泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常。
泛型的本质:把具体的数据类型作为参数传给类型变量。
1:代码
public static void main(String[] args) { // 目标:认识泛型。 ArrayList<String> list = new ArrayList<String>(); // list.add(12); // list.add(12.4); // list.add(false); // list.add('a'); list.add("楚留香"); list.add("石观音"); System.out.println(list); // ArrayList list2 = list; // list2.add(9.9); // System.out.println(list2); for (int i = 0; i < list.size(); i++) { String result = list.get(i); System.out.println(result); } // 注意实现: 泛型和集合都只能支持引用数据类型。只支持对象数据! // ArrayList<int> list2 = new ArrayList<>(); // 错误! // ArrayList<Integer> list3 = new ArrayList<>(); }
2:总结
泛型和集合都只能支持引用数据类型。只支持对象数据!基本数据类型要报装成对象类型。
集合的泛型规定内容后,集合只能放泛型规定的类型。
二:泛型类
概述:
修饰符 class 类名<类型变量,类型变量,…> {}
1:代码
public static void main(String[] args) { // 目标:掌握自定义泛型类。 // 需求:要求你模拟ArrayList集合,自己写一个集合MyArrayList, 可以添加,删除数据。 // MyArrayList<String> list = new MyArrayList<String>(); MyArrayList<String> list = new MyArrayList<>(); // JDK 7开始后面类型可以不写 list.add("Java1"); list.add("Java2"); list.add("Java3"); list.add("Java4"); list.remove("Java2"); list.remove("Java3"); System.out.println(list); }
public class MyArrayList<E> { private ArrayList list = new ArrayList(); public boolean add(E e){ list.add(e); return true; } public void remove(E e){ list.remove(e); } @Override public String toString() { return list.toString(); }
2:总结
可以自定义泛型类,满足需要的类型。
三:泛型接口
概述:
修饰符 interface 接口名<类型变量,类型变量,…> {}
1:需求
处理老师和学生的数据
2:代码
// 自定义泛型接口 public interface Data<T> {//T代表类型,自定义泛型接口 void add(T t); boolean delete(T t); boolean update(T t); T getById(int id); }
四:泛型方法、泛型通配符、上下限
概述:
修饰符 <类型变量,类型变量,…> 返回值类型 方法名(形参列表) {}
泛型方法就是可以在返回值类型左边定义一个类型
可以避免强制类型转换
Java提供了一个语法:泛型通配符:其实就是“?”,可以在使用泛型的时候代表一切类型。
1:代码
public static void main(String[] args) { // 目标:认识泛型方法。 // 需求:提供一个方法,可以打印任意对象数组的内容。 Integer[] arr1 = {11, 223, 243}; printArray(arr1); String[] names = {"所得税", "试试"}; printArray(names); // 避免返回值的强转问题 Integer max = getMax(arr1); String max2 = getMax(names); } public static <T> void printArray(T[] arr){ } public static <T> T getMax(T[] arr){ return null; }
2:上下限
Java提供了一个语法:泛型通配符:其实就是“?”,可以在使用泛型的时候代表一切类型。
泛型上限: ? extends Car: ? 能接收的必须是Car或者其子类 。
最多是Car最低是子类
泛型下限: ? super Car : ? 能接收的必须是Car或者其父类。
最低是Car,最高是父类
3:擦除问题
泛型是工作在编译阶段的,一旦程序编译成class文件,class文件中就不存在泛型了,这就是泛型擦除。
1:代码
ArrayList<String> list = new ArrayList<String>(); // list.add(12); // list.add(12.4); // list.add(false); // list.add('a'); list.add("楚留香"); list.add("石观音"); System.out.println(list);
// ArrayList list2 = list; // list2.add(9.9); // System.out.println(list2);
2:
五:泛型的注意事项:基本数据类型问题
概述:
泛型不能直接支持基本数据类型,只能支持对象类型(引用数据类型)。
1:
很正常