java 基础之泛型理解
1.什么是泛型
- 本质是参数化类型,将所操作的数据类型被指定为一个参数(不能是基本数据类型,可以采用包装类)
- 在定义类、接口、方法的时候不局限地指定某一种特定类型,而让类、接口、方法的调用者来决定具体使用哪一种类型的参数。
- 注意;虽然泛型的参数可以用任何字母来表示,但一般采用T、E、K、V等形式的参数来表示泛型参数。
T:代表一般的任何类。
E:代表 Element 的意思,或者 Exception 异常的意思。
K:代表 Key 的意思。
V:代表 Value 的意思,通常与 K 一起配合使用。
2.1泛型类
- 泛型类的声明与常规类的区别在于其类名后面添加了类型参数声明
public class Test <T> {
private T t;
public void setValue(T value) {
this.t = value;
}
public T get() {
return this.t;
}
}
- 实例化一个泛型类的实例
Test<Integer> var=new Test<>();
var.setValue(1);
注意,此时我们实例化泛型类时指定的参数类型是Integer,在调用其实例方法setValue时,传入的参数也必须与指定的Integer一致(编译器会报错)。
2.2 泛型方法
在泛型方法的声明中,泛型参数的申明在返回值的前面
- 单个参数声明
public <E> E getT(E e) {
System.out.println(e);
return e;
}
- 多个参数申明之间用逗号隔开
public <E,K> E getT(E e,K[] k) {
System.out.println(""+e+k);
return e;
}
2.3 泛型接口
- 与泛型类的声明基本无差别
public interface TestInterface <T> {
T get();
}
2.4 限定符
- extends 该泛型参数E必须已经继承T , 若T为接口,则该参数E必须已经实现接口T
public <E extends T> void hello(E e){
System.out.println("hello");
}
lo(E e){
System.out.println(“hello”);
}