泛型: 泛型的本质是参数化类型,也就是将程序中数据类型指定为一个参数进行使用,泛型分别可以应用于类,接口和方法当中,将其分别称为泛型类,泛型接口,泛型方法
用途分析: 我们可以思考泛型在一些接口当中的应用,例如在List<>接口当中我们就定义了泛型,这是为了帮助我们将一些我们想统一处理但是又可能因为参数不同所导致的问题进行解决。核心:泛型可以用于帮助我们解决一些因为参数不同造成通用方法可能无法实现的问题。
例如: 在实际业务当中当我们需要对每个对象都添加时间的通用操作的时候,我们就可以使用泛型定义出一个通用方法类,当我们需要对当前对象进行修改时间的操作的时候只需要传入此对象即可,随后可以搭配反射操作动态获取每个对象内处理时间的方法函数进行修改时间.
核心:使用泛型在类上进行声明,直到使用当前类时再去进行具体声明
修饰符 class 类名 <泛型变量> {}
-- public class Demo<T>
a. 可以在使用时进行泛型变量确定(之后就被确定,不能再更改了)
-- Demo<Integer> demo = new Demo<Integer>();
-- Demo<Integer> demo = new Demo();
-- Demo demo = new Demo<Integer>();
b. 若在定义使用时不进行确定,则会默认标志为Object类型
-- Demo demo_2 = new Demo();
// 修饰符 class 类名 <泛型变量> {}
public class Demo<T>{
private T x;
public void setX(T x) {
this.x = x;
}
public T getX() {
return x;
}
@Override
public String toString() {
return "Demo{" +
"x=" + x +
'}';
}
}
public class Main{
public static void main(String[] args) {
/*
三种声明等效: 当使用类声明对象的时候进行泛型参数化的确定
Demo demo = new Demo();
Demo demo = new Demo();
Demo demo = new Demo();
*/
Demo<Integer> demo = new Demo<Integer>();
demo.setX(1); // 必须先赋值否则会指向空指针
System.out.println(demo.getX().getClass().getName()); // java.lang.Integer
// 如果不确定泛型参数,则默认为Objecct
Demo demo_2 = new Demo();
demo_2.setX("1");
System.out.println(demo_2.getX().getClass().getName()); // java.lang.String
demo_2.setX(1);
System.out.println(demo_2.getX().getClass().getName()); // java.lang.Integer
}
}
核心:使用泛型在接口上声明,使用时确定参数类型,不确定默认为Object
修饰符 interface 接口名<代表泛型的变量> { }
-- public interface Demo<T>
a. 实现接口时进行参数类型的确定
-- public class Main implements Demo<Integer>
b. 若不在实现接口时对参数进行确定, 可以将此类同时声明为泛型类继续传递,否则会报错.
-- public class Main<T> implements Demo<T>
-- public class Main implements Demo >>>> 报错
// 修饰符 class 类名 <泛型变量> {}
public interface Demo<T>{
public abstract T get(T x);
}
public class Main implements Demo<Integer> { // 类定义时确定泛型种类
public static void main(String[] args) {
Main x = new Main();
Object k = x.get(123);
System.out.println(k.getClass().getName()); // java.lang.Integer
}
@Override
public Integer get(Integer x) {
return null;
}
}
public class Main<T> implements Demo<T> { // 创建对象时确定
public static void main(String[] args) {
Main x = new Main();
Object k = x.get("123");
System.out.println(k.getClass().getName()); // java.lang.String
k = x.get(123);
System.out.println(k.getClass().getName()); // java.lang.Integer
}
@Override
public T get(T x) {
return x;
}
}
核心:使用泛型在方法上声明,在方法调用时指定具体参数类型
修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)) { 方法体; }
a. 一般泛型方法
-- public<T> void say(T x)
b. 静态泛型方法
-- public static <T> void hello(T x)
public class Main {
public<T> void say(T x){ // 一般方法
System.out.println(x);
}
public static <T> void hello(T x){ // 静态方法
System.out.println(x);
}
public static void main(String[] args) {
Main x = new Main();
x.say("这时一般的泛型方法的实现过程....."); // 这时一般的泛型方法的实现过程.....
Main.hello("这是静态方法的实现过程....."); // 这是静态方法的实现过程.....
}
}