一、java泛型
1. ?extends
- ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型
- heroList 的泛型可能是Hero
- heroList 的泛型可能是APHero
- heroList 的泛型可能是ADHero
- 从heroList取出来的对象,一定是可以转型成Hero的。
- 不能往heroList中放东西,只能取。
- 只能取,那么问题来了,哪来的数呢?遍历已经初始化的集合,以参数的形式传入函数中。
ArrayList<APHero> apHeroList = new ArrayList<APHero>();
apHeroList.add(new APHero());
ArrayList<? extends Hero> heroList = apHeroList;
2. ? super
- ArrayList heroList<? super Hero> 表示这是一个Hero泛型或者其父类泛型
heroList的泛型可能是Hero
heroList的泛型可能是Object - 可以往里面插入Hero以及Hero的子类
- 取出来有风险,因为不确定取出来是Hero还是Object
ArrayList<? super Hero> heroList = new ArrayList<Object>();
heroList.add(new Hero());
heroList.add(new APHero());
heroList.add(new ADHero());
//但是,不能从里面取数据出来,因为其泛型可能是Object,而Object是强转Hero会失败
Hero h= heroList.get(0);
3.泛型通配符?
泛型通配符? 代表任意泛型
既然?代表任意泛型,那么换句话说,这个容器什么泛型都有可能
所以只能以Object的形式取出来
并且不能往里面放对象,因为不知道到底是一个什么泛型的容器
4.总结
如果希望只取出,不插入,就使用? extends Hero
如果希望只插入,不取出,就使用? super Hero
如果希望,又能插入,又能取出,就不要用通配符?