Java泛型

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
如果希望,又能插入,又能取出,就不要用通配符?

原文地址:https://www.cnblogs.com/Glov/p/14326165.html