1. 范型类、接口
范型的定义语法
class 类名称 <范型标识,范型标识,…> {
private 范型标识 变量名;
…
}
范型可看成是 类型的形参,实例化类的时候来指定具体的类型,
可定义为 成员变量类型,方法参数类型,方法返回值类型
由外部使用类的时候来指定(new对象 或 子类继承时指定具体类型)
使用时语法:
类名<具体的数据类型> 对象名 = new 类名<具体的数据类型>() ;
只定义了一个范型类,但多个地方代码复用
范型不支持基本数据类型,只支持类类型,
同一范型类,根据不同的数据类型创建的对象,本质上是同一类型
- 从范型类派生子类
子类也是范型类,子类和父类的范型类型要一致。即使子类范型扩展,也要有一个范型和父类一致
class ChildGeneric< T > extends Generic< T > {
}
子类不是范型类,父类要明确范型的数据类型
class ChildGeneric extends Generic< String > {
}
- 范型接口
定义语法
interface 接口名称<范型名称,范型名称,…> {
范型标识 方法名();
…
}
实现类不是范型类,其实现的接口要明确数据类型;
实现类也是范型类,实现类和接口的范型类型要一致
2. 范型方法
在调用方法的时候指明范型的具体类型
语法:
修饰符<T, E, … > 返回值类型 方法名(形参列表){
方法体
}
范型方法中的范型是独立存在的,
即使范型类中定义的和范型方法中一致,两者也没任何关系,
类成员中的T 和 范型方法中的T 可同时存在,但不是同一个,
普通方法中用到了范型的成员,并不是范型方法
支持可变参数的范型方法
范型方法能使方法独立于类而产生变化,
如果static 方法要使用范型能力,就必须使其成为范型方法
3. 类型通配符
类型通配符一般是使用“ ?” 代替具体的类型实参,
所以类型通配符是类型实参,而不是类型形参
优化:限制的是调用时的实参类型
- 类型通配符上限
语法:
类/接口<? extends 实参类型>
要求该范型的类型,只能是实参类型,或实参类型的子类类型
通配符上限是不允许填充元素的
- 类型通配符下限
类/接口 <? super 实参类型>
要求该范型的类型,只能是实参类型,或实参类型的父类类型
4. 类型擦除(编译后)
- 无限制类型擦除
- 有限制类型擦除(上限,下限)
- 桥接方法
5. 范型数组实现(不推荐用 范型数组)