当前位置: 首页 > news >正文

java基础-泛型

文章目录

目录

文章目录

前言

一、泛型的作用

1.类型安全

2.通用性

这里再举个例子

二、泛型的实现

1.泛型类

2.泛型接口

3.泛型方法

4.T符号的起源(额外)

三、泛型擦除

四、泛型通配符

1.上界通配符( )

为什么用于读取?

2. 下界通配符( )

为什么用于写入?

3. 无界通配符( )

​​语法特点​​

?和T

总结

举例

五、泛型限制与注意事项


前言

Java 泛型(Generics)是 JDK 5 引入的核心特性,通过参数化类型实现代码的通用性类型安全


一、泛型的作用

1.类型安全


在泛型出现前,使用Object实现通用容器会导致运行时类型转换错误

List list = new ArrayList();
list.add("Hello");
Integer num = (Integer) list.get(0); // 运行时抛出ClassCastException

使用泛型后,能在编译期发现类型错误:

List<String> list = new ArrayList<>();
list.add(100); // 编译错误:无法添加整数到String列表

2.通用性

常见的例子(集合)都是泛型接口,为的就是确保通用性

试想,如果ArrayList<Integer>是这样的,那么路就走窄了,其他String,Double怎么办,再写一个ArrayList<String>接口出来?明显不合理,而且自己定义的User,Car这个对象,集合怎么存储呢,只有依靠泛型

这里再举个例子

试想一个场景,有多个接口接收到了N个参数,其中M个是通用参数,V个是特有参数,那么这时候为了通用性,我们定义了一个实体类来存储着N个参数叫BaseNotify类,那么问题来了,BaseNotify这个类中我知道有M个是通用参数,这很好写,那么其他的V个参数怎么存放呢

如果有10个接口,每个接口有V个参数是特有的,不可能就要在一个类中写10*V个字段吧,这不科学,那么泛型就很好解决这个问题

看如下示例,在通用类中再定义一个泛型字段,其中OrderNotify是特有的字段,getBizContentObject方法会将bizContentObj这个JSON数据转为T(OrderNotify)类型,这样就实现通用性了

    @Transactional(rollbackFor =Exception.class)@Overridepublic void signalAgentPayCallback(BaseNotify<OrderNotify> notify) {OrderNotify orderNotify;try {orderNotify =  notify.getBizContentObject(OrderNotify.class);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}
@Data
public class BaseNotify<T> {// 通知发送时间@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date notifyTime;// 通知类型private String notifyType;// 通知校验IDprivate String notifyId;// 编码格式private String charset;// 接口版本private String version;// 签名算法类型private String signType;// 签名串private String sign;// 应用IDprivate String appId;// 业务参数集合 - 存储原始JSON字符串private String bizContent;// 已解析的业务参数对象private transient T bizContentObj;/*** 解析bizContent字符串到指定类型的对象* @param clazz 目标类型* @return 解析后的对象* @throws JsonProcessingException 如果解析失败*/public T getBizContentObject(Class<T> clazz) throws JsonProcessingException {if (bizContentObj == null && bizContent != null) {ObjectMapper mapper = new ObjectMapper();// 配置 ObjectMapper 以忽略未知字段mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);bizContentObj = mapper.readValue(bizContent, clazz);}return bizContentObj;}
}
@Data
public class OrderNotify {/*** 必填: 是*/private String orderNo;/*** 商户订单号 (支付订单)* 必填: 是*/private String bizOrderNo;/*** 必填: 否* 说明: 退款订单读字段才返回*/private String oriOrderNo;/*** 原商户订单号* 必填: 否* 说明: 退款订单读字段才返回*/private String oriBizOrderNo;
}

二、泛型的实现

1.泛型类

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("Java");
String value = stringBox.getContent(); // 类型安全

2.泛型接口

public interface Comparator<T> {int compare(T o1, T o2);
}// 实现
public class StringComparator implements Comparator<String> {public int compare(String s1, String s2) {return s1.length() - s2.length();}
}

3.泛型方法

public <T> T getFirstElement(List<T> list) {return list.isEmpty() ? null : list.get(0);
}// 使用
List<Integer> numbers = Arrays.asList(1, 2, 3);
Integer first = getFirstElement(numbers); // 自动类型推断

4.T符号的起源(额外)

上面不管是泛型类还是泛型方法看见其中我们用的参数符号都是T,为什么呢

说白了就是约定俗成,既有语义明确性:T(Type)类型,又不是其他关键字

 其他字符的使用场景

符号​​常见用途​​示例​
T通用类型(Type)List<T>Pair<T>
E集合元素(Element)List<E>Set<E>
K/V键值对(Key-Value)Map<K, V>
R返回值(Result)<R> R execute()
?通配符(Wildcard)List<?><? extends T>

三、泛型擦除

Java泛型是编译期的特性运行时会被擦除为原生类型(Raw Type):

  • List<String> → List

  • T → Object(或边界类型)

  • 插入强制类型转换:(String) list.get(0)

限制

  • 不能创建泛型数组:new T[10] ❌

  • 不能实例化类型参数:new T() ❌

  • 静态成员不能使用泛型类型:

class Box<T> {static T defaultValue; // 编译错误
}

四、泛型通配符

PECS原则(Producer Extends, Consumer Super)

1.上界通配符(<? extends T>

用于读取数据(Producer Extends),白话来说就是该类型最高向上转型到T类型(是T类型或者其子类):

public void printNumbers(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
// 可接收List<Integer>, List<Double>等

该泛型类型可以是T或其子类类型(例如List<? extends Number>可以接收List<Integer>List<Double>等)。 

为什么用于读取?

读取安全
当使用<? extends T>时,编译器知道集合中的元素至少是T类型(或其子类),因此可以安全地将元素当作T类型读取

void printNumbers(List<? extends Number> list) {for (Number num : list) { // 安全读取为NumberSystem.out.println(num.doubleValue());}
}

 写入不安全
由于实际类型可能是T的任意子类(例如IntegerDouble),无法确定具体类型,因此不能向集合中添加元素(除了null)。

void addNumber(List<? extends Number> list) {list.add(100); // 编译错误!无法确定实际类型是否是Integerlist.add(3.14); // 编译错误!无法确定实际类型是否是Double
}

2. 下界通配符(<? super T>

用于写入数据(Consumer Super):

public void addNumbers(List<? super Integer> list) {list.add(100);list.add(200);
}
// 可接收List<Integer>, List<Number>, List<Object>

泛型类型可以是T或其父类类型(例如List<? super Integer>可以接收List<Integer>List<Number>List<Object>)。

为什么用于写入?

写入安全
当使用<? super T>时,编译器知道集合的元素类型至少是T的父类,因此可以安全地写入T类型的元素(因为T是父类的子类型)。

void fillList(List<? super Integer> list) {list.add(100); // 安全写入Integerlist.add(200);
}

 读取不安全
由于实际类型可能是T的任意父类(例如NumberObject),读取时只能当作Object处理,无法确定具体类型。

void readFirst(List<? super Integer> list) {Integer num = list.get(0); // 编译错误!实际类型可能是ObjectObject obj = list.get(0); // 安全,但需要手动类型检查
}

3. 无界通配符(<?>

无界通配符 ? 表示“任意类型”,但​​不关心具体类型​​,仅允许读取为Object

public void processList(List<?> list) {for (Object obj : list) {System.out.println(obj);}
}

​语法特点​

  • ​仅用于引用声明​​:不能用于泛型类、接口或方法的类型参数定义(如 public class Box<?> 是非法的)。
  • ​只能出现在方法参数或局部变量中​​:例如 void printList(List<?> list)

 可以说无界通配符?是上届、下届通配符的基础

?和T

可以互相替换吗?答:不行

?:处理完全未知类型,无需关心具体类型(如通用工具方法)

T:当需要​操作具体类型​​(如调用其方法、约束继承关系)时,使用 T 定义泛型类/方法。

无界通配符适用于​既不生产也不消费数据​的场景(如仅调用 size()clear()

总结

  • Producer(生产者)
    如果泛型对象负责生产数据(如返回元素),使用<? extends T>,因为需要安全读取。

  • Consumer(消费者)
    如果泛型对象负责消费数据(如接收元素),使用<? super T>,因为需要安全写入。

举例

下面是Collections.copy方法,其中src(P)用于生产读取数据到dest(C)消费者中

    public static <T> void copy(List<? super T> dest, List<? extends T> src) {int srcSize = src.size();if (srcSize > dest.size())throw new IndexOutOfBoundsException("Source does not fit in dest");if (srcSize < COPY_THRESHOLD ||(src instanceof RandomAccess && dest instanceof RandomAccess)) {for (int i=0; i<srcSize; i++)dest.set(i, src.get(i));} else {ListIterator<? super T> di=dest.listIterator();ListIterator<? extends T> si=src.listIterator();for (int i=0; i<srcSize; i++) {di.next();di.set(si.next());}}}

所以说我们用copy方法的时候

Collections.copy(A,B);就代表将Bcopy到A

​特性​​无界通配符 ?​上界通配符 ? extends T​下界通配符 ? super T
​类型范围​任意类型T 或其子类T 或其父类
​读操作​元素视为 Object元素视为 T元素视为 Object
​写操作​仅允许 null仅允许 null允许 T 或其子类
​典型场景​通用工具方法、只读遍历只读且需类型安全(如计算总和)写入数据(如添加元素)

五、泛型限制与注意事项

  1. 不能使用基本类型
    List<int> ❌ → 使用包装类List<Integer> ✔️

  2. 不能重载相同原始类型的方法

void print(List<String> list) {}
void print(List<Integer> list) {} // 编译错误:擦除后签名相同

 


相关文章:

java基础-泛型

文章目录 目录 文章目录 前言 一、泛型的作用 1.类型安全 2.通用性 这里再举个例子 二、泛型的实现 1.泛型类 2.泛型接口 3.泛型方法 4.T符号的起源&#xff08;额外&#xff09; 三、泛型擦除 四、泛型通配符 1.上界通配符&#xff08; &#xff09; 为什么用于…...

对抗帕金森:在疾病阴影下,如何重掌生活主动权?

帕金森病&#xff0c;一种影响全球超 1000 万人的神经退行性疾病&#xff0c;正无声地改变着患者的生活轨迹。随着大脑中多巴胺分泌减少&#xff0c;患者逐渐出现肢体震颤、肌肉僵硬、步态迟缓等症状&#xff0c;甚至连扣纽扣、端水杯这类日常动作都变得艰难。更棘手的是&#…...

网络协议与系统架构分析实战:工具与方法全解

网络协议与系统架构分析实战&#xff1a;工具与方法全解 在互联网系统的开发、运维与安全分析中&#xff0c;协议解析与抓包分析是不可或缺的核心技能。本文将系统梳理主流协议解析工具、协议自动识别方案&#xff0c;并结合实际抓包案例&#xff0c;讲解如何还原和推测底层系…...

使用PocketFlow构建Web Search Agent

前言 本文介绍的是PocketFlow的cookbook中的pocketflow-agent部分。 回顾一下PocketFlow的核心架构&#xff1a; 每一个节点的架构&#xff1a; 具体介绍可以看上一篇文章&#xff1a; “Pocket Flow&#xff0c;一个仅用 100 行代码实现的 LLM 框架” 实现效果 这个Web S…...

基于STM32、HAL库的TLV320AIC3204IRHBR音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...

轻量级高性能推理引擎MNN 学习笔记 02.MNN主要API

1. MNN 主要API 注意&#xff1a;本学习笔记只介绍了我在学习过程中常用的API &#xff0c;更多MNN API 请参考官方文档。 1.1. 推理时操作流程 创建Interpreter &#xff1a; createFromFile()通过Interpreter创建Session &#xff1a;createSession()设置输入数据: getSes…...

STM32 ADC 模数转换器详解:原理、配置与应用

STM32 ADC 模数转换器详解&#xff1a;原理、配置与应用 在嵌入式系统中&#xff0c;模数转换&#xff08;ADC&#xff09;是实现传感器信号采集、信号处理等任务的关键环节。STM32 微控制器作为一款功能强大的 32 位微控制器&#xff0c;其内置的 ADC 模块为开发者提供了高效…...

18.Excel数据透视表:第1部分创建数据透视表

一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…...

AI 模型训练轻量化技术在军事领域的实战应用与技术解析

AI 模型训练轻量化技术在军事领域的实战应用与技术解析 一、引言 在人工智能与军事领域深度融合的当下&#xff0c;AI 模型训练轻量化技术正成为破解战场资源限制的关键钥匙。通过模型压缩、量化、剪枝等核心技术&#xff0c;轻量化模型在算力受限、通信不稳定的复杂战场环境中…...

科学养生,开启健康生活

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。科学合理的养生方式&#xff0c;无需依赖传统医学理论&#xff0c;也能有效提升生活质量&#xff0c;为身体注入活力。​ 均衡饮食是养生的基础。每天应保证摄入足够的蛋白质、碳水化合物和脂肪&#xff0c;同时…...

高效跨平台文件传输与管理的工具

软件介绍 这款名为 Coolmuster Mobile Transfer 的工具是一款多平台支持的文件传输工具&#xff0c;能高效地在不同设备间进行文件传输与管理。 适用场景 它适用于多种场景&#xff0c;无论是个人文件整理、家庭成员间资料共享&#xff0c;还是企业场景下的工作文件处理&…...

如何优化 Linux 服务器的磁盘 I/O 性能

# 优化 Linux 服务器磁盘 I/O 性能的全面指南 ## 1. 识别 I/O 瓶颈 首先确定是否存在 I/O 瓶颈以及瓶颈位置&#xff1a; bash # 使用 iostat 查看磁盘 I/O 统计 iostat -x 1 # 使用 iotop 查看进程级 I/O 使用情况 iotop # 使用 vmstat 查看系统整体 I/O 情况 vmstat 1 …...

Python基础学习-Day23

目录 基础概念转换器&#xff08;transformer&#xff09;估计器&#xff08;estimator&#xff09;管道&#xff08;pipeline&#xff09; 实例pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”&#xff0c;也可以翻译为“流水线”&#xff0c;是机器学习中一个重…...

【Ubuntu】扩充磁盘大小

sudo apt-get install gparted 安装完成后&#xff0c;搜索gparted软件&#xff0c;打开gparted 参考...

数据治理域——日志数据采集设计

摘要 本文主要介绍了Web页面端日志采集的设计。首先阐述了页面浏览日志采集&#xff0c;包括客户端日志采集的实现方式、采集内容及技术亮点。接着介绍了无线客户端端日志采集&#xff0c;包括UserTrack的核心设计、移动端与浏览器端采集差异以及典型应用场景崩溃分析。最后探…...

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…...

杰理-701-手表sdk无法电脑连接经典蓝牙

杰理-701-手表sdk无法电脑连接经典蓝牙 只有手机可以连接经典蓝牙播放音乐&#xff0c;电脑无法连接&#xff0c;需要关闭emitter功能 交流q群&#xff1a;187115320...

Timsort 算法

文章目录 1 基础理解1.1 定义和原理1.2 工作原理 2 算法实现2.1 Python 代码实现2.1.1 代码2.1.2 核心逻辑计算最小运行长度&#xff08;calc_min_run(n)&#xff09;插入排序&#xff08;insertion_sort(arr, left, right)&#xff09; 2.2 Java 代码实现2.3 C 代码实现 3 逻辑…...

Go构建高并发权重抽奖系统:从设计到优化全流程指南

引言&#xff1a;为何需要专业抽奖系统&#xff1f; 在现代互联网应用中&#xff0c;抽奖系统被广泛用于营销活动、用户激励等场景。一个好的抽奖系统需要满足&#xff1a; 公平性&#xff1a;确保概率分布准确高性能&#xff1a;支持高并发抽奖请求安全性&#xff1a;防止作…...

深度学习计算

深度学习的飞速发展离不开强大的计算能力支撑。从张量计算到 GPU 加速&#xff0c;从自动微分到分布式计算&#xff0c;深度学习计算的每一项技术都如同精密仪器中的关键齿轮&#xff0c;推动着模型性能的不断提升。本文深入剖析深度学习计算的核心技术、优化策略以及前沿趋势&…...

【Bluedroid】蓝牙 HID DEVICE 初始化流程源码解析

本文深入剖析Android蓝牙协议栈中HID设备&#xff08;BT-HD&#xff09;服务的初始化与启用流程&#xff0c;从接口初始化、服务掩码管理、服务请求路由到属性回调通知&#xff0c;完整展现蓝牙HID服务激活的技术路径。通过代码逻辑梳理&#xff0c;揭示服务启用的核心机制&…...

Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别

在 Kotlin 中&#xff0c;Unit 类型和 Java 中的 void 关键字都用于表示“没有返回值”的函数&#xff0c;但它们在设计理念、类型系统和实际使用中有显著的区别。 1 Kotlin 中的 Unit 类型 表示无返回值&#xff1a; 当函数不返回有意义的值时&#xff0c;Kotlin 使用 Unit …...

Gemini 2.5 推动视频理解进入新时代

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Spark Streaming 内部运行机制详解

核心思想&#xff1a;将实时数据流切割为“微批次”&#xff0c;利用 Spark Core 的批处理能力进行准实时计算。 1. 核心流程拆解 数据接收&#xff08;Input Data Stream&#xff09; 输入源&#xff1a;Kafka、Flume、Socket 等实时数据流。 接收器&#xff08;Receiver&…...

Feign+Resilience4j实现微服务熔断机制:原理与实战

引言&#xff1a;为什么需要熔断器&#xff1f; 在微服务架构中&#xff0c;服务间的依赖调用变得非常普遍。想象一下这样的场景&#xff1a;订单服务依赖支付服务&#xff0c;支付服务又依赖银行网关服务。如果银行网关服务出现故障&#xff0c;故障会向上蔓延&#xff0c;导…...

什么是SparkONYarn模式

1. 什么是 Spark on YARN&#xff1f; Spark on YARN 是 Apache Spark 的一种部署模式&#xff0c;允许 Spark 应用程序在 Hadoop YARN 集群上运行&#xff0c;充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成&#xff0c;使企业能够在同一集群…...

鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目

本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...

操作系统:内存管理

目录 1、主要目标 2、核心概念和技术 2.1 物理内存与虚拟内存 2.2 内存分页机制 2.3 页面置换算法 3、监控与性能优化 3.1 查看物理内存 3.2 查看虚拟内存 3.3 性能问题 1> 内存不足&#xff08;OOM&#xff09; 2> 内存泄漏 3> 内存碎片 3.4 性能优化策…...

腾讯优化DeepSeek的DeepEP通信框架:开启AI大模型训练新时代

事件背景 在人工智能&#xff08;AI&#xff09;技术迅猛发展的当下&#xff0c;大规模AI模型训练的需求与日俱增。高效的数据通信成为了提升AI模型训练效率的关键环节。混合专家模型&#xff08;MoE&#xff09;作为一种高效的大模型架构&#xff0c;通过动态分配专家网络处理…...

CSP-J普及组第一轮真题单选题专项训练(二)

CSP-J普及组第一轮真题单选题专项训练(二) (共15题,每2分,共30分;每题有且有一个正确选项) 1、一个 32 位整型变量占用()个字节。 A. 32 B. 128 C. 4 D. 8 2、在内存储器中每个存储单元都被赋予一个唯一的序号,称为 A、下标 B、序号 C、地址 D、编号 3、编译器的主要…...

Android加固工具测评:易盾、顶象、360加固哪款更好用?

应用安全已经成为每个开发者和企业关注的核心问题。随着黑客技术的不断升级&#xff0c;单一的安全措施已经无法有效应对各种复杂的攻击威胁。Android加固工具应运而生&#xff0c;成为了提升应用安全的关键利器。这些加固工具通过代码混淆、加密、防篡改等技术手段&#xff0c…...

C++ 字符格式化输出

文章目录 一、简介二、实现代码三、实现效果 一、简介 这里使用std标准库简单实现一个字符格式化输出&#xff0c;方便后续的使用&#xff0c;它有点类似Qt中的QString操作。 二、实现代码 FMTString.hpp #pragma once#include <cmath> #include <cstdio> #include…...

内存中的“BANK”

一、BANK的定义与物理结构 基本概念 BANK&#xff08;存储体&#xff09; 是内存芯片内部的一个逻辑或物理分区&#xff0c;每个BANK由存储单元阵列、地址解码电路和缓冲器组成&#xff0c;用于分块管理内存操作。 作用&#xff1a;通过并行操作减少访问冲突&#xff0c;提升内…...

D-Pointer(Pimpl)设计模式(指向实现的指针)

Qt 的 D-Pointer&#xff08;Pimpl&#xff09;设计模式 1. Pimpl 模式简介 Pimpl&#xff08;Pointer to Implementation&#xff09;是一种设计模式&#xff0c;用于将类的接口与实现分离&#xff0c;从而隐藏实现细节&#xff0c;降低编译依赖&#xff0c;提高代码的可维护…...

XA协议和Tcc

基于 XA 协议的两阶段提交 (2PC)。这是一种分布式事务协议&#xff0c;旨在保证在多个参与者&#xff08;通常是不同的数据库或资源管理器&#xff09;共同参与的事务中&#xff0c;所有参与者要么都提交事务&#xff0c;要么都回滚事务&#xff0c;从而维护数据的一致性。 你…...

我们该如何使用DeepSeek帮我们减负?

在当今信息爆炸的时代&#xff0c;如何快速获取、筛选和分析信息已经成为各行各业的重要能力。而DeepSeek作为一种先进的智能搜索和信息挖掘工具&#xff0c;能够帮助用户快速找到所需的信息&#xff0c;并从海量数据中提取出有用的洞见。在这篇博文中&#xff0c;我们将深入探…...

25.5.13

感觉很久没有写算法题了&#xff0c;先来个滑动队列模板题试试水&#xff0c;就是用双端队列来实现会很方便&#xff0c;拿结构体来记录是第几个数和数的值即可&#xff0c;再定义两个双端队列&#xff0c;一个使他的值单调递增一个使他的值单调递减 使队头元素为最大值或者是最…...

软件测试——面试八股文(入门篇)

今天给大家分享软件测试面试题入门篇&#xff0c;看看大家能答对几题 一、 请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff…...

脑机接口技术:开启人类与机器融合的新时代

摘要 脑机接口&#xff08;BCI&#xff09;技术作为一项前沿科技&#xff0c;正在逐步打破人类与机器之间的沟通障碍&#xff0c;为医疗、娱乐、教育等多个领域带来前所未有的变革。本文将详细介绍脑机接口技术的基本原理、发展现状、应用场景以及面临的挑战和未来发展趋势&…...

当三维地理信息遇上气象预警:电网安全如何实现“先知先觉”?

极端天气频发的当下&#xff0c;一场台风、一次暴雨就可能让电力系统陷入瘫痪。但你知道吗&#xff1f;如今的电网已能通过三维地理信息与气象数据的深度融合&#xff0c;在灾害来临前精准锁定风险&#xff0c;甚至将停电事故减少七成以上。这背后&#xff0c;正是国网电力空间…...

C++ string数据查找、string数据替换、string子串获取

string查找示例见下&#xff0c;代码见下&#xff0c;以及对应运行结果见下&#xff1a; #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…...

2025.5.13山东大学软件学院计算机图形学期末考试回忆版本

2025.5.13山东大学软件学院计图期末考试回忆版本 学院&#xff1a;软件学院 老师&#xff1a;周元峰、魏广顺 一、简述题&#xff08;2024原题一&#xff09; 1.图形绘制流水线的组成和作用 2.双缓冲机制是什么&#xff0c;有什么作用&#xff1f; 3.Delaunay三角化的四条…...

思极地图使用

思极地图api文档&#xff1a;思极地图开放平台 | 思极地图API SDK 思极地图SDK: <script src"https://map.sgcc.com.cn/maps?v3.0.0"></script> <script src"https://map.sgcc.com.cn/products/js-sdk/v3/assets/js/jquery-1.11.1.min.js&quo…...

Fiori学习专题四十一:表单控件

上节课我们学习了一些单一控件的使用&#xff0c;但是我们发现在页面内每个控件都占用了一行&#xff0c;这样子就显得不太好看&#xff0c;这节课我们引入一个表单控件来美化一下这个页面。 1.学习表单控件FORM之前我们先了解下哪些情况会使用到表单控件&#xff0c;最常见的场…...

基于STM32、HAL库的TDA7719TR音频接口芯片驱动程序设计

一、简介: TDA7719TR 是 NXP Semiconductors 推出的高性能音频处理芯片,专为汽车音响系统设计。它集成了 AM/FM 收音机调谐器、音频处理和音量控制功能,支持 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 STM32L4 与 TDA7719TR 硬件连接如下…...

Baklib智能云平台加速企业数据治理

Baklib数据治理核心优势 Baklib作为新一代企业级知识中台&#xff0c;其数据治理能力建立在全资产统一管理与智能化处理框架的双重基础之上。通过构建知识中台的核心架构&#xff0c;平台实现了图文、音视频等多模态数据的标准化存储与动态标签体系&#xff0c;有效解决传统管…...

面试中被问到谈谈你对threadlocal的理解

ThreadLocal 的核心理解 1. 基本概念 ThreadLocal 是 Java 提供的线程局部变量机制&#xff0c;用于在多线程环境中为每个线程维护独立的变量副本&#xff0c;实现线程隔离。其核心思想是空间换时间&#xff0c;通过避免共享变量带来的同步开销&#xff0c;提升并发性能。 2…...

Spring Boot 应用中实现基本的 SSE 功能

SSE 技术简介 SSE&#xff08;Server-Sent Events&#xff09;是一种允许服务器主动向客户端推送数据的技术。它基于 HTTP 长连接&#xff0c;使用简单&#xff0c;特别适合实时数据更新场景&#xff0c;如股票行情、新闻推送等。与 WebSocket 相比&#xff0c;SSE 更轻量级&a…...

【2025最新】Windows系统装VSCode搭建C/C++开发环境(附带所有安装包)

文章目录 为什么选择VSCode作为C/C开发工具&#xff1f;一、VSCode安装过程&#xff08;超简单&#xff01;&#xff09;二、VSCode中文界面设置&#xff08;再也不用对着英文发愁&#xff01;&#xff09;三、安装C/C插件&#xff08;编程必备神器&#xff01;&#xff09;四、…...

【MyBatis-8】MyBatis对象关联查询详解:高效处理复杂关系映射

在实际业务开发中&#xff0c;我们经常需要处理对象之间的关联关系&#xff0c;如一对一、一对多、多对多等。MyBatis作为一款优秀的持久层框架&#xff0c;提供了强大的对象关联查询能力。本文将深入探讨MyBatis中各种关联查询的实现方式、适用场景及最佳实践。 1. MyBatis关…...