不使用泛型,
ArrayList heros =
new
ArrayList();
所有对象都可以放进去,那么问题来了,放进去是个AP,你取出来转换成AD,那就报错了
使用泛型,ArrayList<APHero> heros =
new
ArrayList<APHero>();
就只能放入APHero类型,取出来自然也是这个类型
如果泛型定义为<Hero>,那么heros.add(new ApHero());放入子类也是可以的
JDK7简写
ArrayList<Hero> heros2 =
new
ArrayList<>();,聊胜于无
比如有个栈但不支持泛型,如果你要放Heros你要一个这个类型的栈 LinkedList<Hero> heros =
new
LinkedList<Hero>();
你要放items你要一个这个类型的栈,然后分别设计一套完整的栈的方法
那么有么有一个泛型让我的栈可以只需要改变<>里面的来直接得到栈,而不是每次都去写一遍
毕竟那些方法都是相同的
LinkedList<T> values = new LinkedList<T>();
public void push(T t) {
values.addLast(t);
}
public T pull() {
return values.removeLast();
}
public T peek() {
return values.getLast();
}
这样在main函数里面,你需要哪一种只需要更改T就可以了
MyStack<Hero> heroStack = new MyStack<>();
heroStack.push(new Hero());
//不能放Item
heroStack.push(new Item());
————————————————————————————————————————————————————————
通配符
<?extends Hero>表示泛型可能是Hero及其子类
那么可以取,因为一定可以转成父类Hero
但是不能add,因为你添加了AP就不能添加AD
<?super Hero>表示可能是Hero及其父类,也就是objects
那么可以放Hero及其子类,因为都是Hero类,就像<Hero>一样,可以放入其子类
但是取是有风险的,因为不确定是Hero还是objects,万一是objects转换成Hero就会失败
//但是,不能从里面取数据出来,因为其泛型可能是Object,而Object是强转Hero会失败
Hero h= heroList.get(
0
);
ArrayList<?> generalList = apHeroList;
那么这个?就是什么都有可能了
那么一样,什么都不能放
取的话只能转换成最高级,objects
Object o = generalList.get(0);
如果希望只取出,不插入,就使用? extends Hero,因为取可以转换为Hero,插入插了AP不能插AD
如果希望只插入,不取出,就使用? super Hero ,因为插入子类可以,取出不确定是object还是Hero
如果希望,又能插入,又能取出,就不要用通配符?
———————————————————————————————————————————————————————---
泛型转型
对象子类转父类一定可以 h = ad
泛型呢?
ArrayList<Hero> hs =new ArrayList<>();
ArrayList<ADHero> adhs =new ArrayList<>();
//子类泛型转父类泛型
hs = adhs;
不可以,因为hs这个容器是个Hero都可以装(子类,自己),ADHero只能装AD
那么你让一个只能装AD的容器变大就想让他把AP也装了,这是不现实的