泛型是JDK1.5之后增加。
泛型的本质:数据类型的参数化。我们可以把泛型理解为数据类型的一个占位符(形式参数),即告诉编译器,在调用泛型时必须传入实际类型。
没有使用泛型时:
public class Playground {
    public static void main(String[] args) {
        MyCollection myCollection = new MyCollection();
        // 存入容器时不规定类型
        myCollection.set("a", 1);
        myCollection.set(888, 2);
        // 从容器中取出元素时需要转换类型
        String s = (String) myCollection.get(1);
        int i = (int) myCollection.get(2);
    }
}
class MyCollection {
    Object[] objects = new Object[5];
    public void set(Object object, int index) {
        objects[index] = object;
    }
    public Object get(int index) {
        return objects[index];
    }
}
使用了泛型后
public class Playground {
    public static void main(String[] args) {
        // 这里的String就是实际传入的类型,相当于把String赋值给了MyCollection<E>中的E
        MyCollection<String> myCollection = new MyCollection<>();
        // 现在myCollection只能存放String
        myCollection.set("a", 1);
        myCollection.set("b", 2);
        // 从容器中取出元素时无需类型转换,因为myCollection已经规定了String类型
        String s = myCollection.get(1);
    }
}
// 在类的声明时,增加泛型 <E>, 也可以有多个泛型如<E, T, V>
// 可以理解为给这个类添加了一个"标签",规定这个类只能处理类型为E的元素
class MyCollection<E> {
    Object[] objects = new Object[5];
    public void set(E object, int index) {
        objects[index] = object;
    }
    public E get(int index) {
        return (E) objects[index];
    }
}
java容器中大量使用了泛型,如
public interface List<E> extends Collection<E>
public interface Set<E> extends Collection<E>
public interface Map<K,V>