泛型的强大之处在于它可以让一个方法,或者一个类,让多种数据类型通用,大大提高了代码的可复用性
泛型的特点
支持数据类型的多样化 自由
同时严格遵从数据类型的一致化要求 但不失约束
泛型的核心是对方法进行增强
泛型的格式
<大写的单个英文字母无意义占位符> 可以使 A B C D任何一个,但通常使用
T Type 类型
K Key 键
V Value 值
E Element 元素
R Return 返回值
泛型一般用于返回值和参数的增强(扩大方法或类使用范围)
泛型的使用
泛型对单一方法增强
语法格式:
权限修饰符 [static] <自定义泛型占位符> 返回值 方法名(形式参数列表) {
方法体;
}
注意:在形式参数列表内必须有一个和自定义泛型所对应,用来明确泛型的具体类型,这个类型需要在调用方法时明确的传入进来
☆返回值可以是泛型
小思考:
public <T> T test(T t1,T t2) {
System.out.println("这里是t1" + t1);
System.out.println("这里是t2" + t2);
return t1;
}
test(1, "字符串1");
这时T是什么类型的呢?
传入了Integer和String类型,返回值是什么类型呢?
PS:java泛型会把传入的参数默认为包装类,Integer,Float,Double等
Object obj = test(1, "字符串1");
为什么是Object类,Object类是所有类的父类,在你对同一个类的同一种泛型传入两个类型参数,这时jvm蒙了,把T当Integer不合适,当String也不合适,那就给你们一个你们的共同父类Object。但这种情况对于我们开发来说并不是好事,我们在开发时想要给他我们规定的类型的同时还想要他返回我们想要的具体的类型,所以在使用泛型时要遵守【数据类型一致化】原则
泛型对整体方法增强
a. 泛型对类的增强
class 类名<自定义泛型占位符> {
☆成员方法可以使用自定义泛型
}
类带有泛型时,需要对泛型实例化并且确定泛型具体类型才能使用
对带有泛型的类的实例化
// IDEA 写法
类名<具体数据类型> 类对象 = new 类名<>();
// Eclipse 写法
类名<具体数据类型> 类对象 = new 类名<具体数据类型>();
b.泛型对接口的增强
interface 接口名<自定义泛型占位符> { }
注意:接口中的成员变量无法使用自定义泛型,因为缺省属性为 public static final ,定义时需要初始化。无法对于
接口声明泛型有且只用于成员方法。
1. 缺省属性为 public abstract 方法可以使用自定义泛型
2. default 默认方法也可以使用自定义泛型
实现类实现接口的方式有两种模式
1.约束模式:在Implements时,实现类直接给泛型固定的类型
class TypeB implements A<String> {
方法一。。。
方法二。。。
}
2.自由模式:在Implements时,也给一个泛型
class TypeC<T> implements A<T> {
方法一
方法二
}
通过实例化对象来给泛型
PS:要时刻注意泛型是否遵守了【数据类型一致化】原则,不要出现数据类型选择模糊的情况
如有不足,私信或者评论指正,肥肠感激。🙋