使用泛型的好处:
泛型的用法是在容器后面添加<Type>,<Type>可以是类,抽象类,接口
表示这种容器,只能存放这种类型(包括子类对象)
Number的子类:int, float, double
可以设计一个支持泛型的栈MyStack,设计这个类的时候,在类的声明上,加上一个<T>,表示该类支持泛型。
T是typede缩写,也可以使用任何其他的合法的变量,比如A,B,X都可以,但是一般约定成俗使用T,代表类型
ArrayList heroList<?extends Hero>表示这是一个Hero泛型或者其子类泛型
从heroList取出的对象,一定可以转型成Hero的,但是不能往里面放东西
ArrayList heroList<? super Hero> = new ArrayList<Object>()表示这是一个Hero泛型或者其父类泛型
可以往里面插入Hero以及Hero的子类,但是不能从里面取数据出来(可能转换类型失败)。
特例:ArrayList<?> generalList = apHeroList;
像这种形式只能用 Object o = generalList.get(0);取出来,因为?代表任意泛型
总结:
只取出,不插入,?extends Hero
只插入,不取出,?super Hero
如果希望,又能插入,又能取出,就不要使用通配符
父类类型与子类类型不能相互转化,因为你不知道父类类型指向的是什么确切的类型