1、什么是泛型?
泛型就是一个标签:<数据类型> , 泛型可以在编译阶段约束只能操作某种数据类型。
泛型和集合都只能支持引用数据类型,不支持基本数据类型
2、泛型的好处
泛型在编译阶段约束了操作的数据类型,从而不会出现类型转换异常。
 体现的是Java的严谨性和规范性,数据类型,经常需要进行统一!
3、自定义泛型类
泛型类的概念:
         使用了泛型定义的类就是泛型类。
泛型类的格式:
         修饰符 class 类名<泛型变量>{
        }
     泛型变量建议使用 E , T , K , V
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class _202174Demo {
    public static void main(String[] args) {
        MyArrayList<String> a = new MyArrayList<>();
        a.add("vae");
        a.add("vae");
        a.add("许嵩");
        System.out.println(a);
    }
}
class MyArrayList<E> {
    private ArrayList<E> arrayList = new ArrayList<>();
    public void add(E e) {
        arrayList.add(e);
    }
    public void remove(E e) {
        arrayList.remove(e);
    }
    @Override
    public String toString() {
        return arrayList.toString();
    }
}
 泛型方法的定义格式:
         修饰符 <泛型变量> 返回值类型 方法名称(形参列表){
        }
         注意:方法定义了是什么泛型变量,后面就只能用什么泛型变量。
         泛型类的核心思想:是把出现泛型变量的地方全部替换成传输的真实数据类型。
public static void main(String[] args) {
        Integer[] arr = {12,123,214,6,4,3};
        System.out.println(arrToString(arr));
    }
    public static <T> String arrToString(T[] arr) {
        StringBuilder stringBUilder = new StringBuilder();
        stringBUilder.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (arr != null && arr.length > 0)
                stringBUilder.append(i == arr.length - 1 ? arr[i] : arr[i] + ",");
        }
        stringBUilder.append("]");
        return stringBUilder.toString();
    }泛型接口的格式:
         修饰符 interface 接口名称<泛型变量>{
}
泛型接口的核心思想,在实现接口的时候传入真实的数据类型
 这样重写的方法就是对该数据类型进行操作!
interface People<E> {
    void run();
} 
4、泛型通配符
通配符:?
         ?可以用在使用泛型的时候代表一切类型。
         E , T , K , V是在定义泛型的时候使用代表一切类型。
    泛型的上下限:
         ? extends Car : 那么?必须是Car或者其子类。(泛型的上限)
         ? super  Car :那么?必须是Car或者其父类。(泛型的下限。不是很常见)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class _202174Demo {
    public static void main(String[] args) {
        List<Bao> baos = new ArrayList<>();
        baos.add(new Bao());
        run(baos);
        List<Ben> bens = new ArrayList<>();
        bens.add(new Ben());
        run(bens);
    }
    // 注意List<? extends Car>可以接任何以Car为父类的集合
    public static void run(List<? extends Car> cars) {
    }
}
class Car {}
class Ben extends Car{}
class Bao extends Car{}










