一、泛型类的基本概念

1. 什么是泛型类

泛型类是指使用类型参数定义的类,可以在类定义时不指定具体类型,而在实例化时指定。

2. 泛型类的作用

  • 类型安全:编译时检查类型匹配

  • 消除强制转换:减少运行时ClassCastException风险

  • 代码复用:同一套逻辑可适用于多种类型

  • 提高可读性:代码意图更明确

二、泛型类的基本语法

1. 定义泛型类

// T是类型参数,可以是任何非关键字标识符
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}

2. 使用泛型类

Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
String str = stringBox.getContent(); // 不需要强制转换Box<Integer> intBox = new Box<>();
intBox.setContent(123);
int num = intBox.getContent(); // 自动拆箱

三、泛型类的多类型参数

public class Pair<K, V> {private K key;private V value;public Pair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }public void setKey(K key) { this.key = key; }public void setValue(V value) { this.value = value; }
}// 使用示例
Pair<String, Integer> pair = new Pair<>("Age", 25);
String key = pair.getKey();
int value = pair.getValue();

四、泛型类的类型边界

1. 上界通配符(extends)


public class NumberBox<T extends Number> {private T number;public double getDoubleValue() {return number.doubleValue(); // 可以调用Number的方法}
}// 只能使用Number及其子类
NumberBox<Integer> intBox = new NumberBox<>();
NumberBox<Double> doubleBox = new NumberBox<>();
// NumberBox<String> stringBox = new NumberBox<>(); // 编译错误

2. 多重边界


public class MultiBound<T extends Number & Comparable<T> & Serializable> {// T必须是Number的子类,且实现了Comparable和Serializable
}

五、泛型类的继承关系

1. 泛型类可以继承非泛型类

public class GenericChild<T> extends NonGenericParent {// ...
}

2. 泛型类可以继承泛型类

public class Child<T> extends Parent<T> {// 使用相同的类型参数
}public class StringChild extends Parent<String> {// 指定具体类型
}

六、泛型类与静态成员

public class StaticGeneric<T> {// 静态成员不能使用类的类型参数// private static T staticField; // 编译错误// 静态方法可以定义自己的类型参数public static <E> E staticMethod(E input) {return input;}
}

七、泛型类的类型擦除

Java泛型是通过类型擦除实现的,编译后会去除类型参数信息:

// 编译前
Box<String> box = new Box<>();
box.setContent("Hello");// 编译后(近似)
Box box = new Box();
box.setContent((Object)"Hello");
String str = (String)box.getContent();

八、泛型类的高级用法

1. 通配符(?)


public void processList(List<?> list) {// 可以接受任何类型的Listfor (Object item : list) {System.out.println(item);}
}public void processNumberList(List<? extends Number> list) {// 接受Number及其子类的Listfor (Number num : list) {System.out.println(num.doubleValue());}
}

2. PECS原则(Producer-Extends, Consumer-Super)

// 生产者使用extends
public void copyFrom(List<? extends Number> src, List<? super Number> dest) {for (Number num : src) {dest.add(num);}
}

九、泛型类的限制

  1. 不能创建泛型数组

    // T[] array = new T[10]; // 编译错误
  2. 不能实例化类型参数

    // T obj = new T(); // 编译错误
  3. 不能用于静态上下文

    // private static T staticField; // 编译错误
  4. 基本类型不能作为类型参数

    // List<int> list = new ArrayList<>(); // 编译错误
    // 必须使用包装类
    List<Integer> list = new ArrayList<>();

十、泛型类的实际应用

1. 集合框架

List<String> strings = new ArrayList<>();
Map<Integer, String> map = new HashMap<>();

2. 自定义容器

public class Cache<T> {private Map<String, T> cacheMap = new HashMap<>();public void put(String key, T value) {cacheMap.put(key, value);}public T get(String key) {return cacheMap.get(key);}
}

3. 工具类

public class MathUtils {public static <T extends Number> double average(Collection<T> numbers) {double sum = 0.0;for (T num : numbers) {sum += num.doubleValue();}return sum / numbers.size();}
}

十一、总结

Java泛型类的主要特点:

  • 通过类型参数实现通用编程

  • 提供编译时类型安全检查

  • 消除强制类型转换

  • 支持类型边界限制

  • 通过类型擦除实现

合理使用泛型类可以:

  • 提高代码的类型安全性

  • 增强代码的可读性和可维护性

  • 减少重复代码

  • 构建更灵活的API

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

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

相关文章

信任边界的人生智慧

我曾经是个喜欢试探的人 总想知道朋友会不会在我困难时伸手&#xff0c;合作伙伴会不会在利益面前变脸&#xff0c;爱人会不会在诱惑下坚守 结果发现&#xff0c;每一次试探都像是在关系上撒盐 不是因为对方经不起考验&#xff0c;而是「考验」这个行为本身就充满了不信任的…

SQL Server 中 GO 的作用

CREATE DATABASE MyDatabase; USE MyDatabase; GO --定义局部变量 DECLARE s_no varchar(8), s_avgrade numeric(4,1); --对局部变量赋值 SET s_no 20170208; SET s_avgrade 95.0; --使用局部变量 UPDATE student SET s_avgrade s_avgrade WHERE s_no s_no;&#x1f31f; G…

指标中台+大模型:解密衡石Agentic BI的NL2DSL架构实现

——Text2Metrics引擎如何攻克语义鸿沟&#xff0c;碾压传统NL2SQL方案 一、传统NL2SQL的“架构原罪”&#xff1a;业务语义的失控黑洞 当某银行尝试用NL2SQL分析“高净值客户流失率”时&#xff0c;系统生成如下危险SQL&#xff1a; 这正是NL2SQL的三大架构缺陷&#xff1a;…

设计模式 - 抽象工厂

抽象工厂是对工厂的抽象化&#xff0c;而不只是制造方法。 为了满足不同用户对产品的多样化需求&#xff0c;工厂不会只局限于生产一类产品&#xff0c;但是系统如果按工厂方法那样为每种产品都增加一个工厂又会造成工厂泛滥。所以&#xff0c;为了调和这种矛盾&#xff0c;抽…

面向对象Plus(2/2)

目录 面向对象Plus(qianwen) 一.面向对象三大特性 封装 继承 多态 二.多态 1.了解多态 2.体验多态 三.类属性和实例属性 1.类属性 a.设置和访问类属性 类属性的优点 b.修改类属性 四.类方法和静态方法 1.类方法 a.类方法特点 b.类方法应用场景 2.静态方法 a…

MocapApi 中文文档 和github下载地址 NeuronDataReader(以下简称 NDR)的下一代编程接口

以下是 MocapApi 技术文档 github https://github.com/pnmocap/MocapApi?tabreadme-ov-file 国内可以查找getcode 英文文档 https://mocap-api.noitom.com/mocap_api_en.html 概述 MocapApi 是 NeuronDataReader&#xff08;以下简称 NDR&#xff09;的下一代编程接口&…

STM32历史、命名、Flash、工作频率

目录 命名: Flash: 工作频率&#xff1a; 复位&#xff1a; 低功耗模式&#xff1a; IO端口&#xff1a; JATG: 看门狗定时器&#xff1a; STM是一家半导体公式&#xff0c;专门做芯片的&#xff0c;STM32是指32位的微处理器&#xff0c;其中芯片的架构是ARM结构的&#…

了解公共部门中的数据网格:支柱、架构和示例

作者&#xff1a;来自 Elastic Elastic Platform Team 想想那些像公共健康记录、城市规划模型等项目背后的所有数据。政府机构一直在产生大量数据。当数据分散在云平台、本地系统或像卫星和应急响应中心这样的专业环境中时&#xff0c;情况变得更加复杂。找到信息变得困难&…

阿里云ACP-检索分析服务

当数据量爆炸增长&#xff0c;并且需要提供全文检索功能&#xff0c;需要有效的数据检索能力 用什么数据库怎么保证安全性如何解决统计分析问题如何解决单点故障如何解决检索难题 应对方案&#xff1a; 关系型数据库&#xff1a;主从备份解决数据安全性问题&#xff0c;数据…

【DBeaver】跨平台数据库连接工具DBeaver Community 23.2.5安装配置使用

DBeaver是一款免费开源的通用数据库管理工具和SQL客户端&#xff0c;支持多种数据库系统。它基于Java开发&#xff0c;具备跨平台能力&#xff0c;可以在Windows、macOS和Linux系统上运行。 目录 安装DBeaver 连接MySQL数据库 安装DBeaver 进入DBeaver官网 DBeaver Communit…

【钱包】WEB3钱包APP框架的设计

【钱包】WEB3钱包APP框架的设计 一、前言 前段时间&#xff0c;自己做了一款WEB3钱包APP&#xff0c;从产品设计到框架搭建都是我一个人搞的&#xff0c;更多的参考了其他公司的钱包APP。 在此&#xff0c;想把自己的钱包经验分享出来&#xff0c;帮助没有做过钱包APP的同学开…

openGL学习(基本窗口)

学习路线 学习 OpenGL 需要掌握一系列基础知识和技能&#xff0c;这些内容涵盖了计算机图形学的基本概念、编程语言、数学知识以及 OpenGL 的具体 API 使用。以下是学习 OpenGL 所需的主要知识点&#xff1a; 1. 计算机图形学基础 图形学概念&#xff1a;了解图形学的基本概…

无人机防护装置技术解析

一、技术要点 1. 侦测防御系统 多频谱复合探测 整合无线电侦测&#xff08;20MHz–6GHz频段扫描&#xff09;、雷达探测、光电跟踪&#xff08;可见光/红外/激光&#xff09;技术&#xff0c;实现360无死角监测。例如神州明达系统可5公里内识别无人机信号&#xff0c;并同步…

2.2.2、CAN总线-测试模式、工作模式

目录 1、测试模式 2、工作模式 &#xff08;1&#xff09; &#xff08;2&#xff09;SLEEP位&#xff1a; &#xff08;3&#xff09;INRQ位&#xff1a;&#xff08;Init Request&#xff09; &#xff08;4&#xff09;ACK&#xff1a;应答 &#xff08;5&#xff09;…

区块链大讲堂 | 分布式隐私计算友好的零知识证明协议

区块链大讲堂 主讲人&#xff1a;上海交通大学计算机学院助理教授胡云聪 报告题目&#xff1a;分布式隐私计算友好的零知识证明协议 参与方式&#xff1a;扫描海报二维码报名参与活动

MyBatis映射文件(XML)中参数传递和SQL特殊字符处理

1. 参数占位符 1.1 #{} 和 ${} 的区别 #{} 占位符 作用&#xff1a;安全传参。MyBatis在执行SQL时&#xff0c;会把#{}替换成?&#xff0c;然后用参数值自动填充。 优点&#xff1a;可以防止SQL注入&#xff0c;推荐使用。 例子&#xff1a; select * from user wher…

C语言 数据结构 --排序 (直接插入排序,选择排序,交换排序......)

引言&#xff1a;本章简洁的讲解一下数据结构中的几个常见的排序 &#xff0c;作复习之用&#xff0c;后面可能会补一些其他的排序 。并给出一些小编学习中遇到的坑&#xff0c;作借鉴。 1.直接插入排序 直接插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将一个数…

华为云发布盘古大模型 5.5 新一代昇腾 AI 云服务上线

2025 年 6 月 20 日&#xff0c;华为开发者大会 2025&#xff08;HDC 2025&#xff09;在东莞召开。华为常务董事、云计算 CEO 张平安宣布基于 CloudMatrix 384 超节点的新一代昇腾 AI 云服务全面上线&#xff0c;并发布盘古大模型 5.5&#xff0c;五大基础模型实现技术突破&am…

Reactor Handle

handle 是 Reactor 中一个非常灵活的操作符&#xff0c;它允许你对每个源元素进行处理&#xff0c;并可以选择性地发出零个或多个元素。它既可以用于映射&#xff08;map&#xff09;也可以用于过滤&#xff08;filter&#xff09;&#xff0c;因此可以看作是 map 和 filter 的…

C#哈希加密:原理、实现与应用

C#哈希加密&#xff1a;原理、实现与应用 在当今数字化时代&#xff0c;数据安全是每个应用程序都必须重视的问题。哈希加密作为一种重要的加密技术&#xff0c;在密码存储、数据完整性验证、数字签名等领域发挥着关键作用。本文将深入探讨C#中哈希加密的原理、常用算法以及实…