Java的泛型中,通配符可以设置上限和下限。

上限:<? extends T> ?是T和T的子类

下限:<? super T> ?是T和T的父类

怎么看待这个上限和下限呢 首先应该想 其实对于Java来说 <? extends T> <? super T> 是两个确定的类型,因为它不可能由你的赋值完了再确定吧。所以,对于<? extends T> 来说,集合里的元素应该是什么类型呢?应该是T类型,因为你添加的是T或者T的子类,设置为T就可以激发多态了。是了,所以你也只能从这个集合中取出T类型,因为它里面的元素本来设置的就是T类型,你赋值进去只不过是将T的子类赋值给了T,多态。但是呢,你就不能给这个集合里添加元素了,因为这个集合里元素的类型是T,假如可以添加元素,你初始化的时候初始化成T的一个子类,然后添加值的时候,却添加的另一个子类,事实上是可以添加的,因为集合元素类型是T,但里面就有了多种T的子类,好了,你初始化的时候是这个子类,你取出元素的时候肯定也想着取出的是可以给这个子类赋值的类型,但很有可能取出来的是T的另一个子类,你没法赋值,因为你允许添加另一个子类。所以一开始就禁止添加元素是对的。

<? super T>里面的元素,应该设置为什么呢?显然应该是object,因为系统不知道你会把?当成什么,所以只能设置成object,所以你取出元素的时候,取出的是object类。可不可以添加元素呢?可以,因为下限有保证,所以可以添加T和T的子类。你初始化的时候,初始化的是T的某个父类,好了,你现在取元素,你希望取出的是你初始化的那个父类,因为你只能添加T和T的子类,所以你取出的元素,肯定可以赋值给那个父类。

综上,<? extends T> 不可以添加元素,但可以取出类型为T的元素。 <? super T> 可以添加T或者T的子类,取出的一定是object类。

05-11 14:04