概述:
    1、可以在类或方法中预支地使用未知的类型。
    2、参数化类型
    3、泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)
    注意:
    泛型只在编译阶段有效!
    1、泛型参数不是是基础数据类型
    使用:
    泛型有三种使用方法:泛型类、泛型接口、泛型方法(泛型可变参数)

    1. // 泛型类
    2. public class GenericClass<T>{
    3. private T key;
    4. public T getKey(){
    5. return key;
    6. }
    7. public void setKey(T t){
    8. this.key = t;
    9. }
    10. }
    1. // 泛型方法
    2. public class GenericMethod{
    3. public static <T> T method(T t1){
    4. return t1;
    5. }
    6. // 可变参数
    7. public <T> void method(T... args){
    8. for(T item : args){
    9. ...;
    10. }
    11. }
    12. }
    1. //泛型接口
    2. public interface GenericInterface<T>{
    3. T method();
    4. }

    泛型通配符:
    类型通配符一般是使用?代替具体的类型实参,注意了,此处’?’是类型实参,而不是类型形参
    泛型上下边界:
    在使用泛型的时候,我们还可以为传入的泛型类型实参进行上下边界的限制,如:类型实参只准传入某种类型的父类或某种类型的子类。
    上边界:
    设置泛型对象的上限使用extends,表示参数类型只能是该类型或该类型的子类:

    声明对象:类名<? extends 类> 对象名

    定义类:类名<泛型标签 extends 类>{}
    下边界:

    设置泛型对象的下限使用super,表示参数类型只能是该类型或该类型的父类:

    声明对象:类名<? super 类> 对象名称

    定义类:类名<泛型标签 extends类>{}