JAVA:集合泛型的思考
JAVA中关于<? extends T> 和<? super T>的思考
传送门:[知乎问题]
(https://www.zhihu.com/question/20400700)
思考的主要问题在于set/get在两种方式下的不同之处。
1 <? extends T>:
存放的:任何是T或者T的子类的对象。 <= T
可以get,反正这些对象最终都是T或者T的父类。 取出来时,只需要声明为>=T。
无法set,因为不知道到底装的什么类型,无法往里面存储数据(不知道要存储哪种子类类型)。
2 <? super T>:
存放的:任何是T或者T的父类的对象 。 >=T
可以set, 反正放一个T或者T的子类进去完全没问题。放进去任何一个<=T的都行。不能存储T的基类型,因为T基类有很多种,不能确定是存储哪一种,同时基类之间也不见得可以互相转化。
不能get(实际可以取,取出来是Object)。取得时候也不能确定具体是什么,但是,所有对象最终其实都是Object的子类,因此其实可以取出来,但是不建议用。
其实想明白一点:“子类一定是父类,父类不一定能转子类“”。
用图里的关系图做说明:
extends fruit都是<=fruit的对象,因此肯定不能放>=fruit的对象(Food肯定不行呀,关系反了,fruit is a type of food);但是又不知道具体类型,所以也不能放 < fruit 的对象,反正最后就是不能往里面set。
取的时候,那必须都是fruit,甚至可以声明为Food,要是你愿意,Object伺候。
2.
super fruit都是>=fruit的对象,放一个fruit的子类或者fruit都可以,可以向上转型(Apple、Banana都是水果,直接往里面塞就是了)。fruit的基类可能存在并列关系,基类之间不一定能互相转,而且也不确定到底是啥玩意儿,所以不能放基类进去(图中没有例子,但是这个意思应该不难理解)。