Java中约定俗成的泛型通配符【T、E、K、V、?】
文章目录
- 背景
- 通配符
- 1、通配符T
- 2、通配符E
- 3、通配符K和V
- 4、通配符?
- 作用
- 1、类型安全
- 2、消除代码强制转换
- 3、代码复用
背景
在Java语言中,使用泛型来实现参数化的类型,在编译时对输入的参数指定一种数据类型,检查类型是否匹配,避免ClassCastexception异常发生。
在Java中通常约定俗成的通配符,主要有 【T、E、K、V、?】,下面逐个过一遍。
通配符
1、通配符T
T,即type类型,表示任意类型的参数
private class AA<T>{
private T t;
}
// 不带泛型
AA a = new AA();
a.set(new BB());
BB b = (BB) a.get(); // 强制类型转换
// 带泛型
AA<B> a = new AA<B>();
a.set(new BB());
BB b = a.get(); // 不用专门类型转换
2、通配符E
E,即element 元素,集合中的元素类型,比如定义数组
List<E> list = new ArrayList<>();
3、通配符K和V
K,即Key 键,V,即Value值,映射的键对应的数据类型,比如定义Map
Map<K,V> map = new HashMap<>();
4、通配符?
无界通配符<?> 表示不指定类型,即可接收任意类型
public void getResult(List<?> list){
return list.stream.anyMatch(key -> key.equal("123"));
}
上界通配符<? extends T> 类型是T或子类
public <T extends Serializable> T getResult(String key,Class<T> clas){
Object value = map.get("name");
return clas.cast(value);
}
下界通配符<? super T> 类型是T或父类
public <void getResult(String key,<? super Serializable>){
Object value = map.set("name",key);
}
作用
1、类型安全
减少编译的时候报错
2、消除代码强制转换
减少类型转化的操作
3、代码复用
减少重复代码,比如对外提供统一的响应返回类。