1.泛型的使用
1.类的使用
在java库中使用变量E表示集合的元素类型,K和V表示表的关键字和值的类型,T,U,S表示任意类型
public class Pair<T> {
private T first;
private T second;
public Pair() {
first = null;
second = null;
}
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public T getSecond() {
return second;
}
public void setFirst(T first) {
this.first = first;
}
public void setSecond(T second) {
this.second = second;
}
2.方法的使用
定义泛型 放在返回值的前面
public static <T> Pair<T> makePair(Supplier<T> constr) {
return new Pair<>(constr.get(), constr.get());
}
2.限定类型
1.对类型变量加以约束 绑定类型
例如
<T extends Manage> 表示泛型T只能是Manage的子类型
Manage可以是类也可以是接口
2.一个类型变量可以有多个限定 用&连接
T extends Manage & User
限定中最多有一个类 且放在第一个
3.泛型的擦除
1.泛型会自动提供一个原始类型,原始类型的名字就是删掉泛型的类型名。擦除限定类型,并替换为限定变量
例如
Pair<String> 的原始类型名是Pair
里面的限定变量T变为String 例如:
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
替换为
public Pair(String first, String second) {
this.first = first;
this.second = second;
}
Pair<Integer>的原始类型名也是Pair
里面的限定变量T变为Integer
如果没有给限定变量如
Pair<T>的原始类型名也为Pair
public Pair(T first, T second) {
this.first = first;
this.second = second;
}
替换为
public Pair(Object first, Object second) {
this.first = first;
this.second = second;
}
2.编译器的实际操作
例如 Pair中的get方法
1.调用原始的get的方法
public Object getFirst() {
return first;
}
2.将返回值object类型强制转换为例如Pair<String> 转换为String类型
public String getFirst() {
return first;
}
4.注意要点
1.不能用类型参数代替基本类型
2.不能创建参数化类型的数组
3.泛型的静态上下文中类型参数无效
4.不能抛出捕获上下文的实例