泛型
通俗解释:
一个房间,门口站个保安,有门票的进,没门票的不让进!
门票就是泛型对应的泛型实参和元素对应的数据类型要保持一致,保安就是java中的泛型机制
上代码:
ArrayList arrayList = new ArrayList<>();
// ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add("Hello");
arrayList.add(123);
for (Object obj : arrayList) {
System.out.println((String) obj);
}
结果:
以 List 集合为例,什么都可以往里面存储,然后统一被看成是Object类型,但是从List 集合中取值的话,就得用到强制类型转换,需要把 Object 类型转换成我们要的类型,程序繁琐且容易出错。
引入泛型:
泛型作用:
希望集合记住存入的数据是什么类型的,根据泛型参数做筛选,不是同类型的就不允许往一块放,可以避免ClassCastException 错误。
引入泛型后,所有元素都是同一类型,使用时就没必要做强制类型转换了。
定义
参数化类型---- 将类型参数化,也就是说把我们要操作的类型作为了一个参数
泛型实参:< >中的是实际的类型参数,
泛型形参:
泛型中就是使用大写的英文字母来作为类型形参,如图中的 E(原则上任何大写字母都可以)
常用的字母:
E 元素集合框架使用
K 键映射关系键的类型
V 值映射关系中值得类型
N 数字主要用于表示数字
泛型类的继承
继承时不能出现泛型形参,必须将泛型形参确定为相对应的泛型实参。
注:
集合之间没有继承关系,而泛型之间有继承关系的话,集合间的继承关系不成立
自定义泛型
自定义的泛型形参为T,定义一个对应泛型类型的t的私有属性,并设置相应的get()、set()方法。
static class MyTest<T> {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
使用时赋予特定的泛型实参 String,
MyTest<String> test = new MyTest<>();
test.setT("自定义的泛型");
System.out.println(test.getT());
打印结果:
泛型方法
语法:
// 权限修饰符 <泛型形参T、E...> 返回值类型 方法名(形参列表){
// 方法体;
// }
举例:
public <T> void fanMethod(T t2) {
System.out.println(t2.getClass().getName());
}
调用:
test.fanMethod(9);
test.fanMethod('a');
test.fanMethod("hello");
运行结果:
注:
- 权限修饰符和返回值中间的泛型列表,即 < T > 很重要,是泛型方法的标志,有了这个才能叫做泛型方法
- < T >代表将使用泛型类型 T,只有这个时候,方法中才可以使用泛型类型T
- 泛型形参的命名,可以是 T,E,K 等等这些,是个大写的英文字母就行