Java之泛型

发布时间:2024年01月22日

在这里插入图片描述

  • 泛型是一种 , 把类型的明确工作推迟到创建对象/调用方法时 , 的类型.
  • 泛型的本质是参数化类型 , 也就是将所操作的数据类型指定为一个参数.
  • 泛型可以使用在类、方法、接口

泛型的作用:
定义一个泛型类 , 只需在类名后用尖括号将E/T括起来 , 其中E/T都可以 , 本质上是一个占位符 , 意思是先不指定这个动态数组的类型 , 待将来使用时 , 按需指定.
在这里插入图片描述

1.泛型类

需求 : 假设定义一个学生类,类中有一个学号属性,且该属性即可能是int,还可能是String(忽略逻辑硬伤) , 无论外界传入的int还是String , 该类都要正确地接收

public class Student {
/**    private int stuNum;

    public int getStuNum() {
        return stuNum;
    }

    public void setStuNum(int stuNum) {
        this.stuNum = stuNum;
    }
 **/

 private String stuNum;

    public String getStuNum() {
        return stuNum;
    }

    public void setStuNum(String stuNum) {
        this.stuNum = stuNum;
    }
}

若定义为int , 则在别处调用set方法赋值时只能赋int
若定义为String , 则在别处调用set方法赋值时只能赋String
不能满足需求

解决方法1 :
直接把stuNum定义为Object:

    public class Student{
    
    private Object stuNum;

    public Object getStuNum() {
        return stuNum;
    }

    public void setStuNum(Object stuNum) {
        this.stuNum = stuNum;
    }
}

然而这种方法有巨大的缺陷 , Object可以包容所有的类型 , 这样每个Student的的stuNum所存储的东西各式各样 , 例如日期/String/int/,甚至对象都可以从存储进去 , 并且每个程序员之间并不知道对方定义的是什么类型 , 也不知道对方传了什么类型那么

解决方法2 : 泛型

将学生类定义为泛型

//将T看成一个占位符 , 即先不声明Student类的类型,
public class Student<T> {
    //成员属性也是泛型 , 且与类同泛型
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
}
public class TestGeneric {
    public static void main(String[] args) {
        //将String替代占位符T,此时属性只能是String
        Student<String> stringStudent = new Student<>();
        stringStudent.setT("zhinengshiString");
   
        //若实例化对象时也不声明类型,那么默认为Object类型
        Student objectStudent = new Student<>();
    }
}

2. 泛型方法

需求: 在学生类中定义show方法 , 并且show方法可以接收多种类型的参数

public class Student {
    public String show(String str){
        return str;
    }

    public Integer show(Integer integer){
        return integer;
    }
}
public class TestGeneric {
    public static void main(String[] args) {
        Student student = new Student();
        
        student.show("diaoyongString");
        stude6nt.show(18);
    }
}

但是这样做就稍显冗余了,例如 , 若show方法可以接受更多类型的数据呢?那show方法要写几个?
更实际的问题是,有些时候我们甚至不确定将来要往这个方法中传什么数据 ,总不能把所有数据类型全部写上吧?

解决方法 :泛型方法
在这里插入图片描述

//在普通类中定义泛型方法
/**
<T> 传入值采用泛型的方式
T: 返回值采用泛型的方式
show(T t) :参数列表
**/
public class Student {
    public <T> T show(T t){
        return t;
    }
}

//在普通类中定义泛型方法
/**
<T> 传入值采用泛型的方式
void: 返回值为空
show(T t) :参数列表
**/
public class Student {
    public <T> void show(T t){
        return t;
    }
}

测试类中传值:

public class TestMain {
    public static void main(String[] args) {
        Student student = new Student();
        //根据实际传入的参数类型确定泛型方法show的参数类型
        student.show("testString");
        student.show(20);
    }
}
文章来源:https://blog.csdn.net/m0_46671240/article/details/135736709
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。