Java 泛型深入解析

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());
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生架构未来发展趋势,探索容器技术未来的发展趋势

云原生架构未来发展趋势&#xff0c;探索容器技术未来的发展趋势 云原生架构未来发展趋势容器技术发展趋势无处不在的计算催生新一代容器实现深入分布式云&#xff08;从多云/混合云&#xff0c;到分布式云&#xff09;云原生操作系统Kubernetes已经成为云时代的操作系统从无状…

【开源】基于JAVA语言的高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

10+免费图片素材/壁纸网站,搭一些图片处理工具,快收藏!

划到最后“阅读原文”——领取工具包&#xff08;超过1000工具&#xff0c;免费素材网站分享和行业报告&#xff09; Hi&#xff0c;我是胡猛夫~&#xff0c;专注于分享各类价值网站、高效工具&#xff01; 更多资源&#xff0c;更多内容&#xff0c;欢迎交流&#xff01;公 号…

计算机网络(10):下一代因特网

下一代网际协议 IPv6(IPng) 解决IP地址耗尽的措施 要解决IP地址耗尽的问题&#xff0c;可以采用以下三个措施&#xff1a; (1)采用无分类编址CIDR&#xff0c;使IP地址的分配更加合理。 (2)采用网络地址转换NAT方法&#xff0c;可节省许多全球IP地址。 (3)采用具有更大地址空…

chromium在中文用户名下无法编译的问题

新电脑没有太注意&#xff0c;起用户名的时候用了中文。 在编译chromium104的代码时&#xff0c;因为环境变量有中文导致编译失败&#xff1a; 因为我的电脑默认是使用gbk编码&#xff0c;而不是utf-8编码。 这个问题有三种解决办法&#xff1a; &#xff08;一&#xff09;把…

synchronized锁的底层原理

synchronized 锁是 Java 中用于实现线程同步的关键字。它提供了一种简单而有效的方式来确保多个线程之间的互斥访问。底层原理可以通过 Java 的内存模型和对象监视器锁&#xff08;Monitor Lock&#xff09;来理解。 Monitor结构如下&#xff1a; 在 Java 的内存模型中&#x…

微服务注册中心之Eureka

微服务注册中心之Eureka eureka 搭建集群 版本说明 Spring Boot 2.1.7.RELEASE spring-cloud-starter-netflix-eureka-server Finchley.SR2 spring-boot-starter-security 2.1.7.RELEASE pom.xml 文件 <?xml version"1.0" encoding"UTF-8"?> &l…

水稻潜在产量估算解决方案

1.背景与技术路线 统计资料表明&#xff0c;尽管我国粮食单产已由 50 年代初期的 1.2t/ha 增加到如今的 5.2t/h&#xff0c;粮食产量增加了 4 倍&#xff0c;但我国人口的增长速度与气候变化导致的农业生产的不确定性&#xff0c; 在水稻收获指数保持稳定的情况下&#xff0c;…

2397. 被列覆盖的最多行数

给你一个下标从 0 开始、大小为 m x n 的二进制矩阵 matrix &#xff1b;另给你一个整数 numSelect&#xff0c;表示你必须从 matrix 中选择的 不同 列的数量。 如果一行中所有的 1 都被你选中的列所覆盖&#xff0c;则认为这一行被 覆盖 了。 形式上&#xff0c;假设 s {c1…

LRU的设计与实现(算法村第五关黄金挑战)

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

[Javaweb/LayUI/上机考试作业/开源]学生/图书/课程/仓库等管理系统六合一基础功能通用模板

展示 考试要求 给定用户表和六张图书/教师/顾客/仓库....的表&#xff08;随机给每人抽选&#xff09;&#xff0c;要求实现用户登录注册&#xff0c;异步更新&#xff0c;对物品增删改查&#xff0c;精确/模糊查询等。 环境 tomcat 9 mysql 8 java 17 项目结构 项目类图 写前…

DBA技术栈(二):MySQL 存储引擎

2.1 MySQL存储引擎概述 上个业余的图&#xff1a; MyISAM 存储引擎是 MySQL 默认的存储引擎&#xff0c;也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM&#xff0c;是 ISAM 的升级版本。在 MySQL最开始发行的时候是 ISAM 存…

大模型应用实践:AIGC探索之旅

随着OpenAI推出ChatGPT&#xff0c;AIGC迎来了前所未有的发展机遇。大模型技术已经不仅仅是技术趋势&#xff0c;而是深刻地塑造着我们交流、工作和思考的方式。 本文介绍了笔者理解的大模型和AIGC的密切联系&#xff0c;从历史沿革到实际应用案例&#xff0c;再到面临的技术挑…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换(Laplace)传递函数、微分方程

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-4 拉普拉斯变换&#xff08;Laplace&#xff09;传递函数、微分方程 1. Laplace Transform 拉式变换2. 收敛域&#xff08;ROC&#xff09;与逆变换&#xff08;ILT&…

初学者SkyWalking详细使用文档

SkyWalking使用文档 下载地址&#xff1a;https://skywalking.apache.org/downloads/ 主要下载&#xff1a;skywalking apm&#xff08;tar&#xff09; 、agents(tar) 解压&#xff1a; &#xff08;可选操作&#xff09;&#xff1a; ​ apache-skywalking-apm-bin --&g…

【鸿蒙】安装DevEco Studio运行HarmonyOS第一个APP(小白必看)

文章目录 前言一、DevEco Studio是什么&#xff1f;二、DevEco Studio安装运行1. 下载DevEco Studio2. 安装DevEco Studio3. 启动DevEco Studio4. 运行APP5. 修改代码 三、DevEco Studio调试注意事项总结 前言 鸿蒙OS是华为公司开发的一款基于微内核、耗时10年、4000多名研发人…

Lazada商品详情API(lazada.item_get)进行商品的实时更新

一、引言 在数字时代&#xff0c;电商平台如Lazada成为了商品交易的重要场所。为了保持竞争力&#xff0c;实时更新商品信息变得至关重要。Lazada提供的商品详情API&#xff08;lazada.item_get&#xff09;为开发者提供了一个高效的方式来获取并更新商品数据。本文将深入探讨…

“华为杯”杭州电子科技大学2023新生编程大赛---树

题目链接 Problem Description 给定一棵包含 n 个节点的带边权的树&#xff0c;树是一个无环的无向联通图。定义 xordist(u,v) 为节点 u 到 v 的简单路径上所有边权值的异或和。 有 q 次询问&#xff0c;每次给出 l r x&#xff0c;求 ∑rilxordist(i,x) 的值。 Input 测试…

vue保姆级教程----深入了解 Vue3路由守卫

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

XCode Build报错

XCode Build时报以下错误 B/BL out of range 143266484 (max /-128MB) 错误提示表明生成的机器代码太大&#xff0c;超出了限制 需要在XCode工程中添加宏定义&#xff0c;使得生成的可执行文件超过限制 步骤&#xff1a; 在项目设置页面中&#xff0c;选择 “Build Settings…