Java 溯本求源之基础(三十一)——泛型

目录

1. 泛型的定义与基本概念

2. 泛型的优势

3. 泛型的基本语法

3.1 泛型类

3.2 泛型方法

3.3 泛型接口

4. 泛型的边界

4.1 上限通配符(? extends T)

4.2 下限通配符(? super T)

5. 泛型的类型擦除

6. 泛型的使用场景

7. 结语


1. 泛型的定义与基本概念

        在 Java 中,泛型(Generics)是一种强大的特性,它允许在类、接口和方法中使用类型参数。通过泛型,我们可以在编译时指定类、接口和方法的操作对象的类型,从而提高代码的安全性和复用性。

        简单来说,泛型就是类型参数化。通过泛型,开发者可以编写通用的类、接口和方法,而无需在使用时指定具体的类型,直到编译时才决定具体类型,从而实现代码的类型安全和灵活性。

2. 泛型的优势
  • 类型安全:在没有泛型的情况下,集合类(如 ListMap 等)通常只能存储 Object 类型的元素,这就意味着你在提取元素时需要进行类型转换,且可能会导致 ClassCastException 异常。泛型则通过参数化类型来避免这种情况,确保了类型安全。

  • 代码复用:通过泛型,类、方法和接口可以处理不同类型的数据,避免了重复编写相似代码的需要。

  • 提高可读性:使用泛型后,代码会更具可读性,避免了过多的强制类型转换,代码的意图更加明确。

3. 泛型的基本语法
3.1 泛型类

一个泛型类的定义格式如下:

class Box<T> {private T value;public void setValue(T value) {this.value = value;}public T getValue() {return value;}
}

在上面的例子中,T 是类型参数,代表某个具体的类型。在创建对象时,我们可以指定类型:

Box<Integer> integerBox = new Box<>();
integerBox.setValue(10);
System.out.println(integerBox.getValue()); // 输出:10Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
System.out.println(stringBox.getValue()); // 输出:Hello
3.2 泛型方法

除了泛型类外,泛型还可以应用于方法中。泛型方法的定义格式如下:

public <T> void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}
}

这里的 <T> 是方法级别的泛型,它表示方法的返回类型和参数类型是可以自定义的。例如:

public class Test {public static void main(String[] args) {Integer[] intArray = {1, 2, 3};String[] stringArray = {"Hello", "World"};printArray(intArray);  // 输出:1 2 3printArray(stringArray);  // 输出:Hello World}
}
3.3 泛型接口

泛型还可以应用于接口。下面是一个泛型接口的例子:

interface Pair<K, V> {K getKey();V getValue();
}class SimplePair<K, V> implements Pair<K, V> {private K key;private V value;public SimplePair(K key, V value) {this.key = key;this.value = value;}public K getKey() {return key;}public V getValue() {return value;}
}
4. 泛型的边界

        在泛型中,除了可以指定类型,还可以使用边界来限制泛型的类型范围。常见的有上限通配符和下限通配符。

4.1 上限通配符(? extends T

上限通配符用于指定某个泛型类型是指定类型或其子类。例如:

public static void printList(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
4.2 下限通配符(? super T

        下限通配符用于指定某个泛型类型是指定类型或其父类。例如

public static void addNumbers(List<? super Integer> list) {list.add(10);list.add(20);
}

? super Integer 表示这个 list 的类型参数可以是 Integer 类型或其父类(如 NumberObject)。

5. 泛型的类型擦除

        Java 泛型是通过类型擦除来实现的。这意味着在编译时,Java 会将泛型的实际类型替换为原始类型(通常是 Object),因此,在运行时,无法直接获取泛型的类型信息。

例如:

public class Test {public static void main(String[] args) {Box<Integer> intBox = new Box<>();Box<String> strBox = new Box<>();System.out.println(intBox.getClass() == strBox.getClass());  // 输出:true}
}

尽管 intBoxstrBox 是不同类型的泛型对象,但它们的类类型在运行时是一样的。

6. 泛型的使用场景

泛型在实际开发中应用广泛,以下是一些典型的使用场景:

  1. 集合类:Java 集合框架中的大多数类(如 List, Map, Set 等)都支持泛型,用于存储指定类型的对象。

  2. 通用工具类:泛型可以帮助开发者编写通用的方法和类,提高代码复用性。

  3. 设计模式:泛型在很多设计模式中也有广泛应用,如工厂模式策略模式等,能够增强系统的灵活性和可扩展性。

  4. 封装返回值:一些业务属性如果存在很多通用的返回值那么可以进行封装,如web接口返回值中可以设置一些响应信息,以及一些状态码的响应

7. 结语

        Java 中的泛型是一个非常强大的特性,它能够帮助我们提高代码的复用性和类型安全性,同时使得代码更加简洁和易读。通过理解泛型的基本概念和应用场景,开发者可以在实际项目中更加高效地进行开发,减少冗余代码,并增强系统的可扩展性。

掌握泛型的使用,可以让你在开发过程中更加灵活、简洁,并能编写出更具通用性和可维护性的代码。因此,对于每一位 Java 开发者来说,深入理解泛型的特性和应用非常重要。

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

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

相关文章

纯 HTML+CSS+JS 实现一个炫酷的圣诞树动画特效

纯 HTMLCSSJS 实现一个炫酷的圣诞树动画特效 前言 圣诞节快到了&#xff0c;今天给大家带来一个简单但是效果不错的圣诞树动画特效。这个特效完全使用原生 HTML、CSS 和 JavaScript 实现&#xff0c;包含闪烁的星星、随机彩灯等元素&#xff0c;非常适合节日气氛&#xff01;…

Maven:Java项目构建与管理的利器

在Java开发领域&#xff0c;Maven无疑是一个举足轻重的工具。它不仅简化了项目的构建和依赖管理&#xff0c;还促进了团队协作和持续集成。本文将深入探讨Maven的核心功能、基本配置以及在实际项目中的应用。 Maven简介 Maven是Apache基金会下的一个开源项目&#xff0c;旨在…

【ES6复习笔记】Promise对象详解(12)

1. 什么是 Promise&#xff1f; Promise 是 JavaScript 中处理异步操作的一种机制&#xff0c;它可以让异步操作更加容易管理和控制。Promise 对象代表一个异步操作的最终完成或失败&#xff0c;并提供了一种方式来处理操作的结果。 2. Promise 的基本语法 Promise 对象有三…

【RAG实战】语言模型基础

语言模型赋予了计算机理解和生成人类语言的能力。它结合了统计学原理和深度神经网络技术&#xff0c;通过对大量的样本数据进行复杂的概率分布分析来学习语言结构的内在模式和相关性。具体地&#xff0c;语言模型可根据上下文中已出现的词序列&#xff0c;使用概率推断来预测接…

【ES6复习笔记】Map(14)

概念 Map 是 JavaScript 中的一种数据结构&#xff0c;它允许你存储键值对&#xff0c;并且可以通过键来访问对应的值。在本教程中&#xff0c;我们将学习如何声明、添加、删除、获取和遍历 Map 集合。 ES6 提供了 Map 数据结构。它类似于对象&#xff0c;也是键值对的集合。…

富芮坤FR800X系列之PWM输出程序应用设计

文章目录 前言1.设计背景2.简介3.如何设计控制调光的接口呢4.硬件设计5.软件设计5.1.软件流程图5.2.软件代码 6.小结 前言 版权归作者所有、未经允许、请勿转载。 读者对象&#xff1a; 本文档主要适用以下工程师&#xff1a; 嵌入式系统工程师 单片机软件工程师 IOT固…

Ftrans数据摆渡系统 搭建安全便捷跨网文件传输通道

一、专业数据摆渡系统对企业的意义 专业的数据摆渡系统对企业具有重要意义&#xff0c;主要体现在以下几个方面‌&#xff1a; 1、‌数据安全性‌&#xff1a;数据摆渡系统通过加密传输、访问控制和审计日志等功能&#xff0c;确保数据在传输和存储过程中的安全性。 2、‌高…

EasyPoi 使用$fe:模板语法生成Word动态行

1 Maven 依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version> </dependency> 2 application.yml spring:main:allow-bean-definition-over…

定义Shape:打造属于你的独特图形

自定义Shape:打造属于你的独特图形 在Android开发中,自定义图形绘制是一个非常重要的技能,尤其是在需要实现复杂UI或特定设计需求时。Android提供了android.graphics.drawable.shapes包,其中包含了一些基本的形状类,如RectShape、OvalShape等。然而,有时这些基本形状无法…

python 渗透开发工具之SQLMapApi Server不同IP服务启动方式处理 解决方案SqlMapApiServer外网不能访问的情况

目录 说在前面 什么是 SQLMapAPI 说明 sqlmapApi能干什么 sqlmapApi 服务安装相关 kali-sqlmap存放位置 正常启动sqlmap-api server SqlMapApi-Server 解决外网不能访问情况 说在前面 什么是sqlmap 这个在前面已经说过了&#xff0c;如果这个不知道&#xff0c;就可以…

【基础还得练】 KKT 条件

优秀教程-真正理解拉格朗日乘子法和 KKT 条件&#xff1a; link优秀教程-最优化(6)&#xff1a;一般约束优化问题的最优性理论&#xff1a; link KKT条件&#xff08;Karush-Kuhn-Tucker条件&#xff09;是非线性规划中的一组必要条件&#xff0c;在某些情况下也是最优解的充分…

使用 Webpack 优雅的构建微前端应用❕

Module Federation 通常译作“模块联邦”&#xff0c;是 Webpack 5 新引入的一种远程模块动态加载、运行技术。MF 允许我们将原本单个巨大应用按我们理想的方式拆分成多个体积更小、职责更内聚的小应用形式&#xff0c;理想情况下各个应用能够实现独立部署、独立开发(不同应用甚…

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…

【MySQL】十四,MySQL 8.0的隐藏索引

在MySQL 8.0之前的版本中&#xff0c;索引只能直接删除。如果删除后发现引起了系统故障&#xff0c;又必须进行创建。当表的数据量比较大的时候&#xff0c;这样做的代价就会非常高。 在MySQL 8.0中&#xff0c;提供了隐藏索引。如果想删除某个索引&#xff0c;那么在实际删除…

【ES6复习笔记】解构赋值(2)

介绍 解构赋值是一种非常方便的语法&#xff0c;可以让我们更简洁地从数组和对象中提取值&#xff0c;并且可以应用于很多实际开发场景中。 1. 数组的解构赋值 数组的解构赋值是按照一定模式从数组中提取值&#xff0c;然后对变量进行赋值。下面是一个例子&#xff1a; con…

爬虫数据存储:Redis、MySQL 与 MongoDB 的对比与实践

爬虫的核心任务是从网络中提取数据&#xff0c;而存储这些数据是流程中不可或缺的一环。根据业务需求的不同&#xff0c;存储的选择可能直接影响数据处理的效率和开发体验。本文将介绍三种常用的存储工具——Redis、MySQL 和 MongoDB&#xff0c;分析它们的特点&#xff0c;并提…

【Python】使用匿名函数Lambda解析html源码的任意元素(Seleinium ,BeautifulSoup皆适用)

一直都发现lambda函数非常好用&#xff0c;它可以用简洁的方式编写小函数&#xff0c;无需写冗长的过程就可以获取结果。干脆利落&#xff01; 它允许我们定义一个匿名函数&#xff0c;在调用一次性的函数时非常有用。 最近整理了一些&#xff0c;lambda函数结合BeautifulSou…

Bash语言的语法

Bash语言简介与应用 Bash&#xff08;Bourne Again SHell&#xff09;是一种Unix Shell和命令语言&#xff0c;在Linux、macOS及其他类Unix系统中被广泛使用。作为GNU项目的一部分&#xff0c;Bash不仅是对早期Bourne Shell的增强&#xff0c;还引入了许多特性和功能&#xff…

Ingress-Nginx Annotations 指南:配置要点全方面解读(下)

文章目录 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…

互联网路由架构

大家觉得有意义和帮助记得及时关注和点赞!!! 本书致力于解决实际问题&#xff0c;书中包含大量的架构图、拓扑图和真实场景示例&#xff0c;内容全面 且易于上手&#xff0c;是不可多得的良心之作。本书目的是使读者成为将自有网络集成到全球互联网 领域的专家。 以下是笔记内…