(1)?
?表示类型通配符,即具体传什么参数类型,在List定义时不用考虑。
(2)<T>
这里的 <> 表示泛型,T 表示泛型中装载的类型为T类型,等到需要的时候,我们可以具体这个 T。我们在使用动态数组实现 ArrayList 的时候,如果希望这个 ArrayList 不仅仅支持一个类型的话,我们可以给这个 ArrayList 定义泛型,泛型中存放的是T类型。在实际创建出这个 ArrayList 对象时,我们可以指定泛型中的具体类型。
(3)<? extends T>
类型上界,这里的 ? 可以是 T 类型或者 T 的子类类型。
(4)<? super T>
类型下界,这里的?可以是T类型或者T的超类类型,但不代表我们可以往里面添加任意超类类型的元素。
在List中引入通配符界限限制的假设
不管是List还是List,如果能读取元素,那么这个元素一定能转化为 T 类型,注意不是强制类型转换,强制类型转换是容易出现问题。
显然List内都是 T 的子类类型,能够向上转型为 T 类型,因此该 list 可以读取。
而List内可以是 T 的超类类型,T 的超类转 T 是有可能出现异常的。
那我干脆转化成 Object 类型不好吗,所有类的基类都是 Object,不属于强制类型转换。哥们,转换成 Object 了,那你还图个啥?转换为 Object 类型是没有意义的。
假设List能添加元素,那么需要满足添加的任意元素需要能够直接转化成 T 的任何一个子类,T 的子类 A 和子类 B 是不能相互转化的,显然该 list 是不能添加元素的。
假设List能添加元素,那么同样需要满足添加的任意元素能够直接转化成 T 的任何一个超类。此时添加 T 的子类元素就能满足该要求,因为 T 的任意子类可以向上转型成 T 的任何超类。
List<? extends T>
List是被设计用来读取数据的泛型,并且只能读取类型为