这个要比较起来说明的,设置你所谓的上限下限是在参数声明的时候,其他情况不行
1 首先确定的泛型在new时只能new确定的泛型,且其可以使用add方法添加此类型和其子类的实例
2 如上面说的,这样类型就被定义的死死的,不利于多态,所以才有了<? extends Xxx>这种形式,表示list可以为泛型Xxx或者Xxx的子类型,但是这样也有弊端,就是你不能再用add方法,换句话说这样的泛型只能用来做参数传递读取里面的值,无法添加。
3 那么我还想add怎么办,于是有了<? super Xxx>的形式,这样在作为参数传递时候可以传递Xxx以及Xxx父类型的list进来,但是add只能是Xxx或者Xxx的子类(这个到哪都一样,没什么可说的),至于具体怎么用看你的需求了
4 List<?> 任何类型可以传递进来,但不能再add
5 List<Object> 只能是类型<Object>,可以add
6 <?>和<? extends Object>意义相同
Comparator用super的原因是
第一,有些类的比较规则是在它的父类定义的,
第二,java不让父类和子类实现类型参数不同的相同的接口
以List<? super Person> list为例,它可以接收List<Object>、List<Person>,但不能接收List<Student>。
当你想访问list的内容时,如list.get(0),你只能用Object来接收返回值,(因为不能确定list的上限,只能用最上限的Object)。这个用处不是很大,因为你其实不能做什么,除非用强制类型转换。
但是反回来,如果你想往list内加入一个元素,你知道它的下限是Person,所以你可以加Person或者其子类元素,但不能加一个Object元素。
而用List<? extends Person> list2,添加元素这块儿,你就不能往list2里面加元素,因为你不清楚这个list的类型下限在哪儿,所以没法加。 |