泛型
java允许定义泛型类,泛型接口,泛型方法。
支持泛型的动机:看下面两段代码
public interface Comparable{
public int compareTo(Object o);
}
这里<T>
表示泛型类型,使用中可以用具体类型替换它。注意,泛型类型必须是引用类型,不能用int, double, char这些基本类型,应该使用Integer, Double, Character
。(自动打包,自动解包)
public interface Comparable<T>{
public int compareTo(T o);
}
这两段代码在对两个不同类型的对象进行比较时,第一段是运行时报错,而第二段在编译期间就报错了,由此可见,泛型的主要优势是能够在编译时而不是运行时发现错误,泛型可以使程序更加可靠。
受限泛型:将泛型指定为另一种类型的子类型,这种泛型叫做受限泛型。
泛型类
为了定义一个类为泛型类型,需要将泛型类型放在类名之后,例如,GenericStack<E>
。
泛型类的构造方法是public GenericStack()
,而不是public GenericStack<E>()
。
泛型类可以有多个参数,如,GenericStack<E1, E2, E3>
。
泛型方法
为了定义一个方法为泛型方法,要将泛型类型放在方法返回类型之前,例如,<E> void max (E var1, E var2)
。
通配泛型类型有三中形式,?, ? extends T, ? super T
,这里T代表一个泛型类型。第一种形式称为非受限通配,第二种称为受限通配,代表T或者T的一个子类型,第三种称为下限通配,表示T或者T的一个父类型。
- 使用类型消除的方法来实现泛型,编译器使用泛型类型信息来编译代码,但是随后消除它。因此泛型信息在运行时是不可用的。
- 不能使用泛型类型来创建实例
- 不能使用泛型类型参数来创建数组。
- 不能在静态环境中使用类的泛型类型参数
- 在异常类中不能使用泛型类型参数