JAVA基础 - 泛型

news2024/9/9 1:09:51

目录

一. 简介

二. 集合泛型

三. 自定义泛型

四. 自定义泛型类和普通类的区别



一. 简介

泛型是 Java 语言中一种强大的特性,它允许在定义类、接口和方法时使用类型参数,从而增加了代码的类型安全性和复用性。

类型安全性
使用泛型可以避免在运行时出现类型转换错误。例如,如果一个集合被声明为只能存储特定类型的元素,那么在编译阶段就可以检测到试图添加错误类型元素的操作,而不是在运行时才抛出异常。

提高代码复用性
通过泛型,可以编写通用的类和方法,适用于多种不同的数据类型,而无需为每种类型都单独编写重复的代码。

二. 集合泛型

在 Java 的集合框架中,泛型的使用具有重要意义。

集合是用于存储和操作一组对象的数据结构。而泛型使得集合在存储元素时能够明确指定元素的类型,增强了类型安全性和代码的可读性。

例如,ArrayList 集合:

ArrayList<String> names = new ArrayList<>();

这里指定了 names 集合只能存储 String 类型的元素。如果尝试添加其他类型的元素,在编译时就会报错。

对于 HashMap :

HashMap<String, Integer> studentScores = new HashMap<>();

它明确了键是 String 类型,值是 Integer 类型。

泛型在集合中的优势包括:

  1. 类型检查:在编译阶段就确保了添加到集合中的元素类型是正确的,避免了运行时的类型转换错误。
    • 例如,如果试图将一个 Integer 添加到上述的 names 集合中,编译器会给出错误提示。
  2. 代码可读性:使代码更清晰,让其他开发者一眼就能明白集合中存储的元素类型。

再比如 HashSet :

HashSet<Double> prices = new HashSet<>();

通过使用泛型,集合的使用更加准确和安全,减少了潜在的错误,提高了程序的稳定性和可维护性。

三. 自定义泛型

在 Java 中,我们可以自定义泛型类、泛型接口和泛型方法,以满足特定的编程需求。

自定义泛型类

class CustomGenericClass<T> {
    private T data;

    public CustomGenericClass(T data) {
        this.data = data;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

在上述示例中,CustomGenericClass 是一个自定义的泛型类,使用 T 作为类型参数。

自定义泛型接口

interface CustomGenericInterface<T> {
    void performOperation(T element);
}

class CustomGenericInterfaceImpl<T> implements CustomGenericInterface<T> {
    @Override
    public void performOperation(T element) {
        // 具体的操作实现
    }
}

这里定义了一个泛型接口 CustomGenericInterface ,并通过 CustomGenericInterfaceImpl 类来实现它。

自定义泛型方法

class CustomGenericClassWithMethod {
    public <T> void printElement(T element) {
        System.out.println(element);
    }
}

在这个示例中,printElement 方法是一个自定义的泛型方法,它可以接受任意类型的参数。

使用自定义泛型可以使代码更加灵活和通用。例如,在一个处理不同数据类型的场景中,如果没有泛型,可能需要为每种数据类型编写单独的类或方法。而通过自定义泛型,只需要编写一个通用的类、接口或方法,然后在使用时指定具体的类型即可。

假设我们有一个应用,需要对不同类型的对象进行某种处理,比如打印其信息。如果没有自定义泛型,可能需要这样写:

class IntPrinter {
    public void print(int num) {
        System.out.println(num);
    }
}

class StringPrinter {
    public void print(String str) {
        System.out.println(str);
    }
}

但使用自定义泛型,就可以写成:

class GenericPrinter {
    public <T> void print(T element) {
        System.out.println(element);
    }
}

这样大大减少了代码的重复,提高了代码的可维护性和可读性。

四. 自定义泛型类和普通类的区别

自定义泛型类和普通类主要有以下几个方面的区别:

  1. 类型灵活性

    • 自定义泛型类可以在实例化时指定具体的类型,从而适应不同的数据类型需求。例如,MyGenericClass<String> 和 MyGenericClass<Integer> 可以根据实际需求灵活地处理不同类型的数据。
    • 普通类则在定义时就确定了所操作的数据类型,缺乏这种灵活性。
  2. 类型安全性

    • 泛型类在编译时进行类型检查,能够避免类型转换错误。如果尝试将不匹配的类型放入泛型类中,编译器会报错。
    • 普通类在运行时可能会出现类型转换异常,因为其类型的检查不够严格。
  3. 代码复用性

    • 自定义泛型类可以编写一次,然后用于多种不同的数据类型,减少了代码重复。
    • 普通类如果要处理不同类型的数据,可能需要编写多个类似但类型不同的版本。

例如,假设有一个自定义泛型类 Box<T> 用于存储一个元素:

class Box<T> {
    private T item;

    public void setItem(T item) {
        this.item = item;
    }

    public T getItem() {
        return item;
    }
}

我们可以创建 Box<String> 来存储字符串,Box<Integer> 来存储整数。

而如果是普通类,比如 StringBox 专门存储字符串,IntegerBox 专门存储整数,就需要分别为每种类型编写不同的类。

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

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

相关文章

leetcode日记(60)编辑距离

感觉这题不是按难度划分的而是按代码长度划分的…看了答案才知道怎么做&#xff0c;其实思路很简单&#xff0c;但是特别难想…… 意思是使用动态规划&#xff0c;依次计算由word1的前i个字母到word2的前j个字母要经历的最小变化数。 min D[i][j]min(D[i-1][j]1,D[i][j-1]1,D…

spring 中包自动扫描之 component-scan 解析

在 spring 中&#xff0c;为简化 bean 的配置&#xff0c;在 spring-context 模块下提供了包的自动扫描功能&#xff0c;将配置的包及其子包下的所有符合条件的类都注册到 BeanFactory 中。下面来看下具体是怎么实现的。 配置 <context:component-scan base-package"…

【MIT 6.5840(6.824)学习笔记】Raft

1 脑裂 许多容错系统使用一个单主节点来决定主副本。 MapReduce&#xff1a;由单主节点控制计算复制。GFS&#xff1a;主备复制数据&#xff0c;并由单主节点确定主拷贝的位置。VMware FT&#xff1a;主虚机和备份虚机之间复制指令&#xff0c;需要单点的Test-and-Set服务确认…

[0729] X-CMD 发布 v0.4.3:借助 fzf ,提升用户使用体验

目录 X-CMD 发布 v0.4.3&#x1f50e; ll&#x1f50e; jq&#x1f50e; yq&#x1f50e; man X-CMD 发布 v0.4.3 &#x1f50e; ll 新增 --fzf 子命令 该命令借助 fzf 为用户提供了一种高效查找文件和目录的相关信息的方法&#xff0c;类似于文件管理器。 # 使用 fzf 查找文…

AI智能名片O2O商城小程序源码在社区团购中的应用与红利深度探索

摘要&#xff1a;在数字化转型的浪潮中&#xff0c;社区团购以其独特的商业模式和强大的市场渗透力&#xff0c;成为新零售领域的一股不可忽视的力量。而AI智能名片O2O商城小程序源码&#xff0c;作为技术创新的集大成者&#xff0c;正逐步渗透并深刻改变着社区团购的运作模式和…

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

科普文:抽屉合同/协议

抽屉协议是指一种在特定情境下&#xff0c;当事人之间私下签订的、不公开披露的协议。通常情况下&#xff0c;除了协议双方外&#xff0c;其他人并不知道这份协议的存在。这种协议在需要时会被拿出来&#xff0c;因为它已经过双方签字盖章&#xff0c;同样具有法律效应。 背景…

SN65MLVD080使用手册

8通道半双工M-LVDS线路收发器 特性 低压差分30欧姆至55欧姆线路驱动器和接收器&#xff0c;支持信号速率高达250 Mbps&#xff1b;时钟频率高达125 MHz 满足或超过M-LVDS标准TIA/EIA-899多点数据交换规范 受控驱动器输出电压转换时间&#xff0c;提高信号质量 -1V至3.4V共模…

【C++版本】protobuf与gRPC

文章目录 一、Protobuf二、安装以及使用protoc参考 一、Protobuf Google Protocol Buffers&#xff08;protobuf&#xff09;是一种语言中立、平台中立的序列化协议&#xff0c;旨在高效地将结构化数据进行序列化和反序列化。它主要用于通信协议、数据存储和其他需要高效编码和…

【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中&#xff0c;由于传递信号的分析需要&#xff0c;引出了CAN数据帧的ID&#xff0c;长度和数据段的概念&#xff0c;它们都与CAN协议帧相关。CAN协议帧有5种类型&#xff0c;如下表&#xff1a; 而我们当前使用到的是数据帧&#xff0c;故本…

【Qwen-Audio部署实战】Qwen-Audio-Chat模型之FastApi部署实战

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

10 BERT

目录 1 综述 1.1 BERT的核心思想 1.2 BERT的关键技术&#xff1a;预训练阶段 1.3 微调阶段 2 BERT的架构 2.1 输入处理 3. 特征选择/学习模块 BERT 的自注意力过程 4. 预训练任务&#xff1a;同时进行 4.1 Next Sentence Prediction (NSP) 4.2 Masked Language Model…

Url图标实现

Url图标实现 效果如下&#xff1a; 1.引入样式 <link rel"icon" href"favicon.ico"> favicon.ico和对应的html一般需要在同一个目录下&#xff08;同级别&#xff09;。 2.title是用来设置在url页签中显示的名称。 可能存在的问题&#xff1a; …

如何通过前端表格控件实现自动化报表?

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…

filament 初使用记录

安装初始化 一、环境准备 官网要的 我安装的 二、下载安装 安装laravel composer create-project --prefer-dist laravel/laravel 项目名称 10.*导入 filament composer require filament/filament注册 filament 管理面板 php artisan filament:install --panels初始化…

KubeSphere部署:(一)环境准备

本文介绍windows系统&#xff0c;安装wsl虚拟机&#xff08;ubuntu&#xff09;&#xff0c;并在ubruntu中配置连接私有harbor及阿里云镜像等。 在确定该方式前&#xff0c;博主也曾尝试过通过安装Docker Desktop的方式&#xff0c;但每次重启电脑之后&#xff0c;docker桌面端…

Photoshop 2023:创意无限的图像编辑神器

Photoshop 2023 是一款专为 Mac 和 Windows 系统设计的强大图像编辑软件&#xff0c;为专业设计师和业余爱好者提供了无与伦比的创作工具和功能。 一、强大的编辑工具 Photoshop 2023 拥有丰富的编辑工具&#xff0c;如选择工具、画笔工具、橡皮擦工具等。其选择工具能够精确…

Matlab编程资源库(14)常微分方程初值问题的数值解法

一、 龙格&#xff0d;库塔法简介 龙格-库塔法&#xff08;Runge-Kutta method&#xff09;是一种常用的数值解微分方程的方法&#xff0c;由德国数学家卡尔龙格&#xff08;Carl Runge&#xff09;和马丁威尔海尔姆库塔&#xff08;Martin Wilhelm Kutta&#xff09;在20世纪…

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端 1 开发 WebSocket 客户端1.1 开发环境1.1.1 为Qt 6安装 websockets1.2 .基于Qt6的 QWebSocket 客户端示例1.2.1 实现 WebSocket 客户端1.2.2 创建 QtQWesocketClient1.2.3 创建QWebsocket对象1.2.3.1 添加…

轻松实现人声与伴奏分离,轻松获取纯净音质

SpleeterGui是一款用于人声与伴奏分离的开源软件&#xff0c;基于Python的Spleeter库开发而成。SpleeterGui支持的操作系统包括Windows、macOS和Linux&#xff0c;用户可以根据自己的需求选择合适的版本进行下载和使用。 使用教程 1、解压 人声伴奏分离软件-SpleeterGUI_2.9.5…