泛型,宽泛的数据类型”
可以接受任意类型(类)的数据。
■泛型定义(类和接口)
类型参数必须是一个合法的标识符,习惯上使用单个大写字母,通常情况下,
K 表示键,
V 表示值,
E 表示元素,
N表示数字,
T 表示一般意义上的数据类型。
例:class Point<TX, TY>
■泛型变量
泛型类在实例化时必须指出具体的类型,也就是向类型参数。
例:
TX x;
TX y;
■泛型实例化
Point<Integer, Integer> p = new Point<Integer, Integer>();
类型擦除
Point p = new Point();
■泛型方法
class UTest {
public <TX, TY> TX print(TX x, TY y)
public class Point<TX, TY> {
public TX print(TX x, TY y) {
■泛型界限(上界)
public <TSB extends T1> T getMax(T array[]){
此处的”extends“表示的子类型,不等同于继承。
多重限制范围格式
<T extends A & B & C>
使用“&”分隔。且限制范围中之多有一个类。如果用一个类作为限定,它必须是限定列表中的第一个。
■泛型界限(下界)
<T super A>
注意:不能同时声明上界和下界。
■泛型通配符(?)
使用通配符(?)来代表“任意”未知类型,主要用于与泛型类型无关的定义:
public void print(Point<?, ?> p) {
}
最常用的就是Class<?>,因为Class<T>并没有依赖于T。
单独一个“?”的也叫无界通配符。
■通配符的上界
? extends T 表示泛型的类型参数只能是 T 及其子类。
对于通配符的上界,有以下几点:
(假设给定的泛型类型为G,
(如List<E>中的List),两个具体的泛型参数X、Y,当中Y是X的子类)
G<? extends Y> 是 G<? extends X>的子类型
G<X> 是 G<? extends X>的子类型
G<?> 与 G<? extends Object>等同,如List<?> 与List<? extends Objext>等同。
传入的参数是未知的,所以java为了保护其类型一致,禁止向List<? extends X>添加任意对象,不过却可以添加 null,即list.add(null)是可行的。
■通配符的下界
使用通配符(?)不但可以限制类型的上限,还可以限制下限。限制下限使用 super 关键字,例如 <? super TSB> 表示只能接受 TSB 及其父类。
List<Object>与List<?>并不等同,List<Object>是List<?>的子类。还有不能往List<?> list里添加任意对象,除了null。