2017年5月18日 星期四 晴

​ 泛型还是没有整完,其中发现对基本的名词描述理解有问题。实在有些不太注意细节。在原文中,作者描述了很多细节性的东西,比如说?是什么,?可以认为是某类。

​ list<?> 就是某类的列表,或者说装了某东西的篮子。那么这个篮子只能读出某东西,不能写入某东西。 为什么要存在这样的通配符号,我认为设计目的是为了在让泛型参数可以接受父类列表参数。比如

1
public void T test(List<?> list, T t){}

这样,在泛型中就可以操作更广泛的类。? extends T 标示T的某个子类,? super T 标示T的某个父类。

如果listA 是T的某个子类的列表,那么我们可以从这个列表中获取到T,但是因为我们不知道列表究竟存入的是哪个子类,所以我们无法向其中加入元素。

如果listB是T的某个父类的列表,那么我们可以向这个列表中放入T元素和T的子类元素,但是因为我们不知道具体是哪个父类,说以我们只能返回Object最上级父类。

​ 这样概念就清晰多了。有时候,个人感觉把东西写下来或者读出来或者说出来,那么感觉理解中不明白的地方就会变得有所领悟。这个方法应该也可以用在其他一些地方来完成一些有意思的东西。

​ 为什么要有这个抽象的范式,我觉得主要的场景就是调用范例方法时,写入的参数可以不仅仅是List,而可以扩充为List<?>,List<? extends T>, list<? super T>,这样提供了更高的自由度。当然最主要的原因是

1
List<Fruit> fs = new ArrayList<Apple>()

是错误的。