- 通配符相关:
首先我们要明白类型擦出是怎么回事,也就是说,类型的确定是编译时确定的;编译时发现你往里存的对象有问题就报错;如果运行了你通过反射强制向里面添加元素其实是随便的;
< T >表示某种类型,比如Integer;< ? >表示不知道具体那种类型;< T >简单啊,你添加,读取都是T类型;?呢,不知道是哪种类型,能放进去吗?显然不能啊,你总不能把电视和地球放在一起把,这样会很奇怪;但是?读取,就会很方便,因为集合里已经有了这么一些东西,我管它是啥呢,拿出来就好了;
以这种思想,我们来看一下上下界通配符;
< ? extend A> 也就是T是个A的子类,那是哪个呢?很显然,你没办法向里面储存A的全部子类吧;比如T是个A的其中大儿子的儿子;那么A小儿子的儿子,很显然存不进去的嘛;但是反过来我不管T是哪个类,它总可以向上转型为A,所以就可以读取并转型为A;(不可转型为A的子类);
< ? super B> 就是说T是B得一个父类,那么很显然的,存什么我都可以把它转型为T嘛,因为T是B的父类嘛;但是当你读取的时候,T?B的父类,那是个什么玩意,到底是父亲,还是爷爷,还是Object呢?所以无法读取;除非你读取转型为Object;