Java泛型是什么?有什么作用?

Java泛型(Generics)是Java语言中一种类型参数化的机制,允许在类、接口、方法中使用类型参数,使代码能够处理多种数据类型,同时保证类型安全。泛型的主要目的是增强代码的复用性安全性,避免类型转换错误。

泛型的核心概念

  • 类型参数化
    在定义类、接口或方法时,用<T>、<K,V>等形式声明类型参数,实际使用时再指定具体类型。

    // 泛型类
    public class Box<T> {private T content;public void setContent(T content) { this.content = content; }public T getContent() { return content; }
    }// 使用
    Box<String> stringBox = new Box<>();
    stringBox.setContent("Hello");
    String value = stringBox.getContent(); // 无需强制类型转换
    
  • 类型安全
    编译器会检查泛型类型的合法性,防止在集合中混入不兼容的类型。

    List<String> list = new ArrayList<>();
    list.add("Java");
    // list.add(100); // 编译报错:类型不匹配
    

泛型的作用

  1. 类型安全(Type Safety)
    在编译阶段进行类型检查,避免运行时出现ClassCastException

    // 不使用泛型(存在风险)
    List list = new ArrayList();
    list.add("Java");
    list.add(100); // 编译通过,但运行时会出错
    String s = (String) list.get(1); // 运行时抛出ClassCastException// 使用泛型(类型安全)
    List<String> safeList = new ArrayList<>();
    safeList.add("Java");
    // safeList.add(100); // 编译直接报错
    
  2. 消除强制类型转换
    从集合中获取元素时,无需显式强制转换。

    List<String> names = new ArrayList<>();
    names.add("Alice");
    String name = names.get(0); // 直接返回String类型
    
  3. 代码复用
    通过泛型类、泛型方法,编写可处理多种类型的通用代码。

    public static <T> T getFirstElement(List<T> list) {return list.get(0);
    }
    // 支持任何类型的List
    String s = getFirstElement(Arrays.asList("A", "B"));
    Integer n = getFirstElement(Arrays.asList(1, 2));
    
  4. 增强可读性
    泛型让代码的意图更明确。例如,Map<String, Integer>直接表明键是String,值是Integer。

泛型的核心特性

  1. 类型擦除(Type Erasure)
    Java泛型在编译后会被擦除,转换为原始类型(Raw Type),并在必要时插入强制类型转换。

    // 编译前
    List<String> list = new ArrayList<>();
    // 编译后(类型擦除)
    List list = new ArrayList();
    
  2. 通配符(Wildcards)
    (1)使用?表示未知类型,解决泛型类型的灵活性问题。
    (2)上界通配符(<? extends T>):接受T及其子类。
    (3)下界通配符(<? super T>):接受T及其父类。

    // 上界通配符:可以读取,不能写入
    List<? extends Number> numbers = new ArrayList<Integer>();
    Number num = numbers.get(0); // 允许读取
    // numbers.add(10); // 编译报错// 下界通配符:可以写入,读取为Object
    List<? super Integer> list = new ArrayList<Number>();
    list.add(100); // 允许写入
    Object obj = list.get(0); // 读取为Object
    
  3. 泛型边界(Bounded Type)
    通过 “T extends SomeClass” 限制泛型类型的范围。

    public class Calculator<T extends Number> {public double sum(T a, T b) {return a.doubleValue() + b.doubleValue();}
    }
    // 只能使用Number及其子类(如Integer、Double)
    Calculator<Integer> intCalc = new Calculator<>();
    

泛型的典型应用场景

  • 集合框架(Collections)
    List、Map<K,V>等集合类均使用泛型,确保元素类型安全。

    Map<String, Integer> scores = new HashMap<>();
    scores.put("Alice", 90);
    
  • 工具类(如Optional)
    包装可能为空的值,避免NullPointerException。

    Optional<String> name = Optional.ofNullable(getName());
    
  • 函数式接口(如Function<T,R>)
    支持泛型参数和返回值,用于Lambda表达式。

    Function<Integer, String> intToString = num -> "Value: " + num;
    

注意事项

  • 泛型不支持基本类型
    必须使用包装类(如List<Integer>,而非List<int>)。

  • 类型擦除的限制
    无法在运行时获取泛型类型信息(如new T()或T.class)。

  • 泛型数组的创建
    直接创建泛型数组是非法的,需通过反射或强制转换。

总结

Java泛型通过类型参数化,提供了一种类型安全的编程方式,避免了强制类型转换的繁琐和潜在错误,同时提升了代码的可读性和复用性。尽管存在类型擦除等限制,泛型仍是Java开发中不可或缺的核心特性。

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

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

相关文章

医院手术麻醉信息系统是如何为医院提质增效的?

近年来&#xff0c;随着HIS系统、LIS系统、PACS系统、EMR系统等信息系统的出现&#xff0c;医疗信息化已成为医疗领域推广的重点&#xff0c;显著提高了医院业务的运营效率。手术麻醉系统作为医院信息系统的一部分&#xff0c;由两个子部分组成&#xff1a;监测设备数据采集系统…

ios打包需要的证书及步骤

官网&#xff1a;https://developer.apple.com/account 避免他人登录apple账号的方法&#xff1a;就是让他们发测试设备的udid&#xff0c;手动注册到账号下&#xff0c;然后再给他们导p12证书和描述文件 iOS App Development iOS 开发版本签名&#xff08;仅限 iOS App&#x…

C#特性和反射

1。特性概念理解&#xff1f; 特性&#xff08;Attribute&#xff09;是用于在【运行时】传递程序中各种元素&#xff08;比如类、属性、方法、结构、枚举、组件等&#xff09;行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所…

【毕业论文格式】word分页符后的标题段前间距消失

文章目录 【问题描述】 分页符之后的段落开头&#xff0c;明明设置了标题有段前段后间距&#xff0c;但是没有显示间距&#xff1a; 【解决办法】 选中标题&#xff0c;选择边框 3. 选择段前间距&#xff0c;1~31磅的一个数 结果

操作系统-八股

进程基础&#xff1a; 进程定义&#xff1a;运行中的程序&#xff0c;有独立的内存空间和地址&#xff0c;是系统进行资源调度和分配的基本单位。 并发&#xff0c;并行 并发就是单核上面轮询&#xff0c;并行就是同时执行&#xff08;多核&#xff09;&#xff1b; 进程上下…

骑士74CMS_v3.34.0SE版uniapp全开源小程序怎么编译admin和member流程一篇文章说清楚

有粉丝一直问我骑士系统怎么编译后台和小程序目前骑士人才系统74CMS分标准版&#xff0c;创业板&#xff0c;专业版&#xff0c;其除功能不同外其配置方法完全一致有喜欢系统的也可以私信我或者找我获取 一.安装打包环境[Nodejs]这个就不用我说了吧&#xff0c;用不小于V20的版…

c语言zixue

该文主要是记录我学习中遇到的一些重点、易出问题的内容 教材p16.17 先从一个简单的例子开始吧 #include <stdio.h> //编译预处理命令 int main() //程序的主函数 {printf("To C"); //输出语句return 0; //返回语句 } #include <stdio.h>是编译预…

ollama API 本地调用

ollama API 本地调用 前提条件&#xff0c;ollama 已经启动了模型&#xff0c;查看 ollama 中的 model 名称 ollama list使用 openai 调用 from openai import OpenAI import openaiopenai.api_key ollama openai.base_url http://localhost:11434/v1/def get_completion(pro…

es6 尚硅谷 学习

1、let 1.变量不能重复声明 2.块级作用域 &#xff0c;只在块内有效 3.不存在变量提升&#xff0c;变量未声明之前不可使用 4.不影响作用域链 2、const const SCHOOL “温医”&#xff1b; 1.一定要有初始值 2.一般常量使用大写 3.常量不能赋值 4.块级作用域 5.对数组和对象…

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…

C#通过API接口返回流式响应内容---分块编码方式

1、背景 上一篇文章《C#通过API接口返回流式响应内容—SSE方式》阐述了通过SSE&#xff08;Server Send Event&#xff09;方式&#xff0c;由服务器端推送数据到浏览器。本篇是通过分块编码的方式实现 2、效果 3、具体代码 3.1 API端实现 [HttpGet] public async Task Chu…

【SpringMVC】入门版

1.基本概念 1.1三层架构 三层架构也就是我们常说的b/s架构中的表现层&#xff0c;业务层和持久层,每层都各司其职&#xff0c;下面来分别讲解这三层的作用。 表现层&#xff1a; 也就是我们常说的web层。它负责接收客户端的请求&#xff0c;向客户端响应结果&#xff0c;通…

各省水资源平台 水资源遥测终端机都用什么协议

各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动&#xff0c;经过多年建设&#xff0c;基本都已经形成了稳定的通讯要求&#xff1b;河北瑾航科技 遥测终端机&#xff0c;兼容了大部分省市的通讯协议&#xff0c;如果需要&#xff0c;可以咨询和互相学习&…

【Android】RuntimeShader 应用

1 简介 RuntimeShader 是 Android 13&#xff08;T&#xff09;中新增的特性&#xff0c;用于逐像素渲染界面&#xff0c;它使用 AGSL&#xff08;Android Graphics Shading Language&#xff09;编写着色器代码&#xff0c;底层基于 Skia 图形渲染引擎。官方介绍详见 → Runti…

ShenNiusModularity项目源码学习(16:ShenNius.Admin.Mvc项目分析-1)

ShenNius.Admin.Mvc项目是MVC模式的启动项目&#xff0c;包括了MVC模式下所需的所有的页面、控制器类、资源、js文件等数据&#xff0c;该项目仅依赖ShenNius.Admin.API项目&#xff0c;主要使用后者的ShenniusAdminApiModule模块类及一些依赖项目中定义的辅助类等。本文学习Sh…

maven wrapper的使用

写在前面 考虑这样的场景&#xff0c;张三创建了一个maven项目使用了3.9版本&#xff0c;当李四下载下来去开发配置的却是3.6版本&#xff0c;此时李四就不得不再去配置一个3.9版本的maven&#xff0c;为了解决这个问题&#xff0c;maven引入了maven wrapper的机制&#xff08…

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…

如何用正则表达式爬取古诗文网中的数据(python爬虫)

一、了解正则表达式的基本内容&#xff1a; 什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称 regex&#xff09;是一种用于匹配字符串的模式。它通过特定的语法规则&#xff0c;可以高效地搜索、替换和提取文本中的特定内容。正则表达式广泛应用于…

网络空间安全(33)MSF漏洞利用

前言 Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源安全漏洞利用和测试工具&#xff0c;广泛应用于渗透测试中。MSF提供了丰富的漏洞利用模块&#xff0c;允许安全研究人员和渗透测试人员利用目标系统中的已知漏洞进行攻击。 一、漏洞利用模块&…

PBS 脚本及 运行

PBS 脚本命令的调度 PBS 脚本运行命令**如何跑&#xff1f;**准备 PBS 脚本&#xff1f; 成品 本文涉及&#xff1a; PBS 命令 Shell 命令 Python 命令 使用命令行运行作业&#xff0c;需要在 HPC 中放好 PBS 脚本。 如何写一个 PBS 脚本&#xff0c;下面以自己的 PBS 脚本为例…