java的一个设计理念是 ,与泛型相关的异常最好是在编译期间就被发现 , 因此设 计了extends与super这两种方式 。具体来说 ,List<? extends T>表示该集合中存在的都是类型T的子类 ,包括T自 己 。
而List<? super T>表示该集合中存的都是类型T的父类 ,包括T自己 。
List<? extends T>如果去添加元素的时候 , 因为list中存放的其实是T的一种子 类 ,如果我们去添加元素 ,其实不知道到底应该添加T的哪个子类 ,这个时候桥 接方法在进行强转的时候会出错 。但是如果是从集合中将元素取出来 ,我们可以 知道取出来的元素肯定是T类型 。所以? extends T这种方式可以取元素而不能添 加 ,这个叫get原则 。List<? super T>因为存的都是类型T的父类 ,所以如果去添加T类或者T类子类的 元素 ,肯定是可以的 。但是如果将元素取出来 ,则不知道到底是什么类型 ,所 以? super T可以添加元素但是没法取出来 ,这个叫put原则 。常见的一些泛型标识就是T(类型)、E(元素)、K(key)、V(value)、? (通配符 ,不确定的)这几个 ,其实填任何字母都行 。