<泛型>学习笔记
泛型:编写的代码可被不同类型所重用
一.基础
使用地方:
- 泛型类
- 泛型接口
- 泛型方法
二.注解
1.
(1).泛型类声明方法:
class Generic<T>{
private T field;
public T method(T param){
}
}
main{
Genenic<Integer> test = new Genenic<>();
}
外部实例化类时,类中的所有T 会自动转化为对应类型。
(2).泛型接口
interface Generic<T>{ }
(3).泛型方法
public <T> T method(T param){}
第一个<T>为 引入类型
调用方法时确定引入类型后
方法中的所有 T -> 引入类型
2.T extends S
当需要使 泛型结构只能设置为 某特定类型 及 其子类 时,
将<T> 替换为<T extends S>
多种类型则用&连接
3.泛型通配符
由于泛型数据结构搭载 类型时 无法使结构本身获取类型自带的 继承关系...?
例子如下:
Basketball 与 soccer 均为Ball子类
但Basket<Ball> 却无法与 Basket<Basketball> 相互赋值
所以产生了界定符
/*类定义*/ public class Ball{} class Basketball extends Ball{} class Soccer extends Ball{} /*泛型类,用于搭载球类*/ public class Basket<T extends Ball>{ private T ball; public Basket(Ball ball){ this.ball = ball; }
} main(){ Basket<Basketball> basket1 = new Basket(new Basketball); Basket<Ball> basket2 = basket1; //此会报错 }
(1)上限界定符<? extends S>
Basket<? extends Ball>则使 Basket能接受的类型为 Ball自身及其子类
缺陷:此泛型类只能从中取数据,不可向其中放数据
(2)下限界定符<? super S>
Basket<? extends Basketball>则使Basket能接受的类型为 Basketball自身及其父类
缺陷:此泛型类只能向中放数据,不可从其中取数据
三.扩展
由于泛型是JDK5才出现的,为了保证兼容性
泛型的实现机制是,在编译时 通过类型擦除 将T转化为Object
(若T有继承,则转化为第一个继承类)
而继承泛型方法是通过 自动桥机制 进行实现。
注释:S指代 特定类型

浙公网安备 33010602011771号