• java的泛型


    含义:

    含义:参数化类型。

    注意:泛型只在源代码中存在,在编译之后的字节码文件中,泛型又会被转回原始类型。

    为什么使用泛型?

    • 规定操作的数据类型,避免运行时报错
    • 避免强转

    案例

    下面是没有加泛型的

    1. List arrayList = new ArrayList();
    2. arrayList.add("aaaa");
    3. arrayList.add(100);

    假如我们输出arrayList中的值程序就会报错,为什么呢?因为我们往集合中加入了两种不同类型的数据。那么有没有一种办法能让我们在创建对象的时候就规定好对象可以操作的类型呢?泛型就可以

    加了泛型之后,如果我们往里面加入int类型的数据,程序已经开始报错了。

    1. List<String> arrayList = new ArrayList<String>();
    2. arrayList.add(100); 报错

    在类中使用

    先来看语法

    1. class 类名 <泛型名>{
    2. private 泛型名 泛型变量名;
    3. ....
    4. }

    单单看语法可能回有点晕,实际上就是泛型就像一种数据类型,在创建类的时候指明类中方法操作的数据类型。我们直接看下面案例:

    1. public class Animal<T> {
    2. private T t;
    3. public void Animal(T t){
    4. this.t = t;
    5. }
    6. public T getanimal(){
    7. return t;
    8. }
    9. }
    10. public static void main(String[] args) {
    11. Animal a = new Animal<>(1);
    12. String b = a;//报错,a为Integer类型
    13. System.out.println(a);
    14. Animal str = new Animal<>("test");
    15. System.out.println(str);
    16. }

    我们定义了Animal类中方法的操作的数据类型是T,在new Animal对象的时候指定了操作的方法为Interger或者String;更具需要指定操作的数据类型。

    在接口中使用 

    泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中。

    直接看案例

    1. public interface a<T> {
    2. public T test();
    3. }

    目的是要求实现必须被指定为泛型类

    1. class b<T> implements a<T>{
    2. @Override
    3. public T test() {
    4. return null;
    5. }
    6. }

     

    在方法中使用

    在方法中使用会比类中使用更难理解,主要有两个形式。在普通方法中使用泛型和泛型方法。

    泛型方法

    泛型类是在类实例化的时候指定对象操作的数据类型;泛型方法是在调用方法的时候指明方法的操作类型。

    下面定义了一个泛型方法,用来指定返回类型为T。我们可以根据需要返回不同的类型。

    1. public static T getData(boolean b){
    2. if(b){
    3. return (T)"对";
    4. }
    5. else
    6. return (T)(Integer)0;//这里不能是基本数据类型
    7. }
    1. String str = getData(true);
    2. int u = getData(false);
    3. System.out.println(str+u);

    注意:泛型执行的操作类型必须为引用数据类型。

    在普通方法中使用泛型

    在编写类的时候还不不确定要传进取的数据类型时候,可以使用

    语法:

    问号是固定写法

    1. //static void add1(List t)报错。<>必须要是问号
    2. static void add(List t){
    3. }

    案例

    1. /*代表传进去的必须是User的子类*/
    2. static void add1(Listextends User> t){
    3. }
    4. /*代表传进去的必须是User的父类*/
    5. static void add2(Listsuper Studnet> t){
    6. }

  • 相关阅读:
    Linux 任务进程命令练习
    SpringMVC综合案例
    【三维重建】Ubuntu18.04安装COLMAP
    「Redis数据结构」QuickList
    VMware下安装、配置ubuntu虚拟系统
    Zabbix小实验
    docker 安装minio 教程
    Linux——03(Shell命令介绍、帮助命令、常用命令(文件目录类、echo > head tailf ln history))
    基于物联网的水质监测系统设计与实现:React前端、Node.js后端与TCP/IP协议的云平台集成(代码示例)
    国内外开源数据可视化工具对比:DataEase相较于MetaBase有何优势
  • 原文地址:https://blog.csdn.net/m0_52261367/article/details/126074990