Java泛型
为什么要使用泛型?
不使用泛型的情况下,所有对象都可以放进容器中,当需要取出对象的时候,你有可能忘记了所取出的这个对象的类型。这样,就有可能出现类型转换异常。
怎么使用泛型
泛型的用法是在容器后面添加<type>
,此类型和此类型的子类都可以放进容器,与之无关的类型无法放进容器。写法如下
ArrayList<Hero> heros = new ArrayList<Hero>();
//泛型的简写方法
ArrayList<Hero> heros2 = new ArrayList<>();
设计泛型类
设计这个类的时候,在类的声明上,加上一个<T>
,表示该类支持泛型。
T是type的缩写,也可以使用任何其他的合法的变量,比如A,B,X都可以,但是一般约定成俗使用T,代表类型。
public class Container<T> {
...
}
通配符
?extends
假设使用Container container<? extends Fruit>
表示这是一个Fruit泛型或者其子类泛型,泛型可能是Apple,Orange…所以,从中取出来的对象,一定可以转型Apple
但是,不能向容器中放入对象,因为如果你放了Orange,那么不满足container<Apple>
这个泛型
? super
假设使用Container container<? super Fruit>
表示这是一个Fruit泛型或者其父类泛型,泛型可能是Fruit或者Object。可以往容器中插入Fruit及Fruit的子类 ,但是取出来有风险,并不能确定是Fruit还是Object。
泛型通配符?
泛型通配符? 代表任意泛型
既然?代表任意泛型,那么换句话说,这个容器什么泛型都有可能
所以只能以Object的形式取出来
并且不能往里面放对象,因为不知道到底是一个什么泛型的容器
总结
如果希望只取出,不插入,就使用? extends
如果希望只插入,不取出,就使用? super
如果希望,又能插入,又能取出,就不要用通配符?