一、? extends
- 举例说明
ArrayList heroList<? extends Hero> //表示这是一个Hero泛型或者其子类泛型
这就代表heroList的泛型可能是Hero、APHero、ADHero(APHero、ADHero均是Hero子类)
所以,从集合中取出来的对象,一定是可以转型成Hero的
但是,不能往集合里去添加,因为
放APHero就不满足"ADHero"
放ADHero又不满足"APHero"
heroList.add(new ADHero()); //编译错误,因为heroList的泛型 有可能是APHero
二、? super
- 举例说明
ArrayList heroList<? super Hero> 表示这是一个Hero泛型或者其父类泛型
这就代表heroList的泛型可能是Hero和Object,可以往里面插入Hero及其子类
但是,如果取出来会有风险。因为不确定取出来的到底是Hero类型还是Object类型的
Hero h= heroList.get(0);//其泛型可能是Object,而Object是强转Hero会失败
三、总结
如果希望只取出,不插入,就使用? extends
如果希望只插入,不取出,就使用? super
如果希望,又能插入,又能取出,就不要用通配符’?’