就比如集合是一个容器 它是一种类型 容器里面存的是什么 不知道
    这个时候就可以用泛型来描述容器里存的数据类型 我们存什么 它就代表什么

    关于泛型
    由于ArrayList底层是一个Object[] 什么类型都能存进去
    取出来的时候是一个多态效果 需要自己造型 显得用起来很麻烦

    JDK1.5版本后—->泛型
    用来规定数据类型的 定义的时候用一个符号代替某种类型
    在使用的时候用具体的数据类型 将定义的那个符号替换掉
    注意:泛型需要使用引用数据类型来代替
    泛型不能使用基本类型 若想使用基本类型 需要使用其对应的包装类
    泛型可以用在哪里?
    1.泛型类
    类定义的时候描述某种数据类型 集合的使用就是这样
    如类定义时为 ArrayList 代表的就是一种数据类型 只要你输入了一种类型 后面就只能输入这一种类型
    比如 ArrayList = new ArrayList(); —->此时集合中只能放String类型的
    2.泛型接口
    与泛型类基本一致 因为接口要由子类实现 所以子类实现接口时必须添加泛型
    public interface Test{
    public X value;

    }
    public class Son implements Test{

    }
    3.泛型方法
    方法调用时传参数 方法的泛型与类无关 带有泛型方法可以不放在带有泛型的类中 可以在正常类中
    4.方法参数泛型限制 规范边界
    如(Collection<? extends E> c)

    ArrayList list1 = new ArrayList();
    LinkedList linked = new LinkedList(list1);

    //Collection<? extends E> c
    //前提都要求是Collection类型下的
    //其次?表示传入参数的任意类型 E是我们指定的类型
    //我们指定的类型 即Object 传入参数的类型为String
    //String为Object的子类 所以满足条件
    //或者 可以是和Object同一等级的也可以
    //即传进来的参数类型要 小于等于 我们指定的类型