Java 泛型深入解析

news2024/11/28 8:51:56

Java 中的泛型是一种强大的编程特性,允许我们编写更加通用和类型安全的代码。本篇博客将深入探讨 Java 泛型的各个方面,包括泛型类、泛型方法、泛型接口以及泛型通配符。

1. 泛型类

首先,让我们看一个简单的泛型类的例子。在下面的代码中,我们定义了一个名为 GenericClass 的泛型类,它具有一个泛型参数 T,并包含了构造方法、获取数据的方法和设置数据的方法。

public class GenericClass<T> {
    private T data;

    // 构造方法
    public GenericClass(T data) {
        this.data = data;
    }

    // 获取数据的方法
    public T getData() {
        return data;
    }

    // 设置数据的方法
    public void setData(T data) {
        this.data = data;
    }
}

通过这个泛型类,我们可以创建具有不同类型的实例,例如:

// 使用泛型类,指定类型为String
GenericClass<String> stringGeneric = new GenericClass<>("Hello, Generics!");

// 使用泛型类,指定类型为Integer
GenericClass<Integer> intGeneric = new GenericClass<>(42);

2. 泛型方法

泛型不仅限于类,还可以用于方法。下面的代码展示了一个包含泛型方法的类 MyGeneric,其中包括一个打印泛型类数据的方法。

public class MyGeneric {

    // 泛型方法
    public <T> void printData(GenericClass<T> generic) {
        System.out.println(generic.getData());
    }

    // 其他泛型方法和示例省略...
}

通过这个泛型方法,我们可以在不同的上下文中打印不同类型的数据,使得代码更加灵活。

3. 泛型接口

Java 还支持泛型接口,这使得我们可以定义接口时使用泛型参数。下面的代码展示了一个泛型接口 GenericInterface 及其实现类 StringContainer

public interface GenericInterface<T> {
    T getData();

    void setData(T data);
}

public class StringContainer implements GenericInterface<String> {
    private String data;

    @Override
    public String getData() {
        return data;
    }

    @Override
    public void setData(String data) {
        this.data = data;
    }
}

泛型接口提供了一种灵活的方式来定义可以处理多种类型数据的接口,并使得实现类更具通用性。

4. 泛型通配符

Java 的泛型还支持通配符,其中 <?> 表示未知类型。这种通配符的使用使得我们可以编写适用于多种泛型类型的代码。下面的代码展示了一个使用泛型通配符的方法。

public class MyGeneric {

    // 使用泛型通配符的方法,接受任意泛型类型的参数
    public static void printWildcardData(GenericClass<?> generic) {
        System.out.println("Wildcard data: " + generic.getData());
    }

    // 其他代码和示例省略...
}

通过这个方法,我们可以传递任意泛型类型的参数,提高了代码的灵活性。

5. 泛型 record 类

在 Java 14(? 目前使用的是 Java 17) 中引入的 record 类型也支持泛型。下面的代码展示了一个泛型 record 类 Pair

public record Pair<T>(T first, T second) {
    // 这里没有额外的方法,因为 record 自动生成了构造方法、getter 方法等
}

record 类提供了一种简洁的方式来定义不可变类,并通过泛型支持处理不同类型的数据。

6、完整代码

在这里插入图片描述

package com.lfsun.generic;

// 定义一个泛型类
public class GenericClass<T> {
    private T data;

    // 构造方法
    public GenericClass(T data) {
        this.data = data;
    }

    // 获取数据的方法
    public T getData() {
        return data;
    }

    // 设置数据的方法
    public void setData(T data) {
        this.data = data;
    }
}

package com.lfsun.generic;

// 定义一个泛型接口
public interface GenericInterface<T> {
    T getData();

    void setData(T data);
}

package com.lfsun.generic;

// 定义一个泛型 record 类
public record Pair<T>(T first, T second) {
    // 这里没有额外的方法,因为 record 自动生成了构造方法、getter 方法等
}

package com.lfsun.generic;

// 实现泛型接口的类
public class StringContainer implements GenericInterface<String> {
    private String data;

    @Override
    public String getData() {
        return data;
    }

    @Override
    public void setData(String data) {
        this.data = data;
    }
}

package com.lfsun.generic;

// 定义一个包含泛型方法的类
public class MyGeneric {

    // 泛型方法
    public <T> void printData(GenericClass<T> generic) {
        System.out.println(generic.getData());
    }

    // 泛型方法示例,接受任意类型的数组并打印
    public static <E> void printArray(E[] array) {
        for (E element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }

    // 使用泛型通配符的方法,接受任意泛型类型的参数
    public static void printWildcardData(GenericClass<?> generic) {
        System.out.println("Wildcard data: " + generic.getData());
    }

    public static void main(String[] args) {
        // 使用泛型类,指定类型为String
        GenericClass<String> stringGeneric = new GenericClass<>("Hello, Generics!");

        // 使用泛型方法,打印泛型类的数据
        MyGeneric myGeneric = new MyGeneric();
        myGeneric.printData(stringGeneric);

        // 使用泛型接口,实现类存储String类型数据
        StringContainer stringContainer = new StringContainer();
        stringContainer.setData("Generic Interface Example");
        System.out.println("Data from interface: " + stringContainer.getData());

        // 使用泛型方法,打印任意类型的数组
        Integer[] intArray = {1, 2, 3, 4, 5};
        String[] stringArray = {"apple", "banana", "orange"};
        printArray(intArray);
        printArray(stringArray);

        // 使用泛型通配符的方法,打印任意泛型类型的数据
        GenericClass<Double> doubleGeneric = new GenericClass<>(3.14);
        printWildcardData(doubleGeneric);

        // 创建 Pair 实例,指定泛型类型为 String
        Pair<String> stringPair = new Pair<>("Hello", "World");

        // 访问 record 自动生成的 getter 方法
        System.out.println("First: " + stringPair.first());
        System.out.println("Second: " + stringPair.second());
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1356902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

功能问题:如何限制同一账号只能在一处登录?

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

C语言快速入门——基础知识

C语言基础 C语言基础C程序基本格式基本数据类型原码、反码和补码原码反码补码 整数类型浮点类型字符类型 变量变量的使用无符号数类型转换 运算符基本运算符运算符优先级自增自减运算符位运算符逻辑运算符 流程控制分支语句 - if分支语句 - switch循环语句 - for循环语句 - whi…

两种高效计算 两个经纬度之间距离的方法--解决Haversine 公式性能慢的问题

目录 前言 Haversine 原理 实现代码 优化后的距离计算 原理 代码 性能及精度对比 前言 最新开发的业务中&#xff0c;涉及到计算两个经纬度之间的距离。已知A点和B点的 经纬度&#xff0c;计算A点到B点之间的距离。最开始使用的是Haversine公式来进行计算&…

opencv期末练习题(8)附带解析

图像切片 %matplotlib inline import cv2 import matplotlib.pyplot as plt def imshow(img,grayFalse,bgr_modeFalse):if gray:img cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)plt.imshow(img,cmap"gray")else:if not bgr_mode:img cv2.cvtColor(img,cv2.COLOR_BGR2RG…

014、枚举与模式匹配

枚举类型&#xff0c;通常也被简称为枚举&#xff0c;它允许我们列举所有可能的值来定义一个类型。在本篇文章中&#xff0c;我们首先会定义并使用一个枚举&#xff0c;以向你展示枚举是如何连同数据来一起编码信息的。 接着&#xff0c;我们会讨论一个特别有用的枚举&#xff…

双碳管理系统任务需求分析(第10套)

需求规格说明书 一、引言 &#xff08;一&#xff09;项目背景 编写本需求规格说明书的目的是为了详细呈现碳足迹产品需求和系统的功能描述&#xff0c;以进一步定制应用软件系统开发的细节问题&#xff0c;便于与项目开发协调工作。本文档面向的读者主要是项目委托单位的管…

找不到vcruntime140.dll怎么处理?6个修复教程分享

本文将详细介绍vcruntime140.dll文件的相关内容&#xff0c;并提供6个不同的修复教程&#xff0c;帮助大家解决这一问题。 一、vcruntime140.dll是什么文件&#xff1f; vcruntime140.dll是Visual C Redistributable Packages的一部分&#xff0c;它是Microsoft Visual Studi…

Alice Bob推出16量子比特量子处理单元——“Helium 1”

​&#xff08;图片来源&#xff1a;网络&#xff09; 容错量子计算机硬件开发商Alice & Bob宣布已成功流片一款新芯片“Helium 1”&#xff0c;希望能借助该芯片降低随着量子比特数增加而提高的错误率&#xff0c;这是该公司第一个纠错逻辑量子比特&#xff08;纠错量子计…

MySQL Enterprise版本各系统安装包下载

一、官方下载地址 oracle下载地址 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 使用oracle账号登录进去 Category选择Download Package(下载安装包)&#xff0c;搜索栏输入mysql Enterprise关键字点search进行搜索。选项结果第一个MySQL Enterprise Edition&a…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…

【绘图软件】自用安装教程

链接&#xff1a;https://pan.baidu.com/s/17r9Pr460FzkULU7fTr91_w?pwdftv7 提取码&#xff1a;ftv7 --来自百度网盘超级会员V6的分享解压并且右键打开set up 解压crack软件前需要退出杀毒软件&#xff0c; 关闭实时保护 域网络关闭&#xff0c;专用网络关闭&#xff0…

【源码分析】 Calcite 处理流程详解:calcite架构、处理流程以及就一个运行示例进行源码分析

文章目录 一. Calcite整体架构二. Calcite处理流程三. 处理流程样例说明1. 样例demo1.1. 样例数据1.2. 使用calcite 2. 流程源码分析Step1: SQL 解析阶段&#xff08;SQL–>SqlNode&#xff09;Step2: SqlNode 验证&#xff08;SqlNode–>SqlNode&#xff09;1. 注册元数…

接口自动化测试,完整入门到入职篇

一、自动化测试 众所周知&#xff0c;自动化测试已经成为软件项目中不可或缺的测试方法。基于用户交互界面&#xff08;GUI&#xff09;的自动化测试方法具有模拟用户行为和过程可视化的特点&#xff0c;因此受到了广大入门自动化人士的喜爱。诸如&#xff1a;QTP、Selenium等…

JMeter 插件大全:详细介绍 Jmeter 常用插件

JMeter作为一个开源的接口性能测试工具&#xff0c;其本身的小巧和灵活性给了测试人员很大的帮助&#xff0c;但其本身作为一个开源工具&#xff0c;相比于一些商业工具&#xff08;比如 LoadRunner&#xff09;&#xff0c;在功能的全面性上就稍显不足。这篇博客&#xff0c;就…

深入了解 Vite:快速、简洁、高效的前端构建工具(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

MySQL数据库索引优化实战

目录 一、前言 二、准备工作 2.1 用户表&#xff08;TB_USER) 2.2 商品表&#xff08;TB_SKU) 2.3 订单表&#xff08;TB_ORDER&#xff09; 三、实例分析 3.1 索引提升查询性能 3.2 多表查询 3.3 索引失效 四、总结 一、前言 在数据库的应用中&#xff0c;性能优化…

【操作系统】输入输出系统

6.1 I/O系统的功能、模型和接口 I/O系统管理的主要对象是I/O设备和相应的设备控制器。其最主要的任务是&#xff0c;完成用户提出的I/O请求&#xff0c;提高I/O速率&#xff0c;以及提高设备的利用率&#xff0c;并能为更高层的进程方便地使用这些设备提供手段。 6.1.1 I/O系…

本地git服务器的使用

最后总结一句&#xff0c;用gitlab最省事&#xff0c;管理权限最方便&#xff0c;别像下文一样整了。 Windows上使用&#xff1a; 首先要在windows开发机上生成密钥&#xff1a; 1.安装git&#xff0c;首先去git官网下载git&#xff0c;https://git-scm.com/downloads&#xff…

2023年工作初体验

23年终于正式入职&#xff0c;参与了正式上线的电商平台、crm平台等项目的研发&#xff0c;公司规模较小&#xff0c;气氛融洽&#xff0c;没有任何勾心斗角、末位淘汰&#xff0c;几乎没什么压力。虽然是我的第一家公司&#xff0c;但实际是个适合养老的公司&#xff08;笑 总…

Web自动化测试:POM设计模式的实现

关于pom设计模式(project Object model/PageObject)&#xff0c;一种底层、逻辑、用例的分层&#xff0c;在项目还没有开发出来时&#xff0c;就可以开始写UI自动化脚本了&#xff0c;在开发完成后&#xff0c;再进行元素定位的适配以及调试&#xff1b;而且也可以多人共同维护…