一、简介
1. 以集合为例,不指定泛型的容器,可以存放任何类型的元素,指定了泛型的容器,只能存放指定类型的元素以及其子类。
2. 泛型的用法是在容器后面添加<Type>,一般简写为<T>,Type可以是类,抽象类,接口。ArrayList<Hero> heroes = new ArrayList<Hero>();,JDK7以后,后面的泛型可以用<>来代替,写为ArrayList<Hero> heroes = new ArrayList<>();
二、通配符
1. ? extends
ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型。heroList 的泛型可能是Hero,heroList 的泛型可能是APHero,heroList 的泛型可能是ADHero。
所以 可以确凿的是,从heroList取出来的对象,一定是可以转型成Hero的。但是,不能往里面放东西,因为,放APHero就不满足<ADHero>,放ADHero又不满足<APHero>。
2. ? super
ArrayList heroList<? super Hero> 表示这是一个Hero泛型或者其父类泛型。heroList的泛型可能是Hero,heroList的泛型可能是Object。
可以往里面插入Hero以及Hero的子类,但是取出来有风险,因为不确定取出来是Hero还是Object。
3. ?
泛型通配符? 代表任意泛型,换句话说,这个容器什么泛型都有可能。所以只能以Object的形式取出来,以其它任意形式取出都会报编译错误,并且不能往里面放对象,因为不知道到底是一个什么泛型的容器。
总结:如果希望只取出,不插入,就使用? extends。如果希望只插入,不取出,就使用? super。如果希望,又能插入,又能取出,就不要用泛型。
三、泛型转型
子类泛型不可以转换为父类泛型,父类泛型也不可以转换为子类泛型。