《理解 Java 泛型中的通配符:extends 与 super 的使用场景》
大家好呀!👋 今天我们要聊一个让很多Java初学者头疼的话题——泛型通配符。别担心,我会用最通俗易懂的方式,带你彻底搞懂这个看似复杂的概念。准备好了吗?Let’s go! 🚀
一、为什么我们需要泛型通配符?🤔
首先,让我们回忆一下泛型的基本概念。泛型就像是一个"类型参数",它让我们可以写出更通用的代码。比如:
List stringList = new ArrayList<>();
List intList = new ArrayList<>();
但是,当我们想要写一个方法,可以处理不同类型的List时,问题就来了。比如,我想写一个打印所有List元素的方法:
public void printList(List list) {for (Object elem : list) {System.out.println(elem);}
}
这个方法看起来不错,但实际上它不能处理List
或List
!😱 因为List
并不是List
的子类型(虽然String是Object的子类)。
这就是通配符要解决的问题!它让我们可以更灵活地处理不同类型的泛型集合。🎯
二、通配符基础:问号(?)的魔力 ✨
通配符就是一个简单的问号?
,它表示"未知类型"。我们可以这样改写上面的方法:
public void printList(List list) {for (Object elem : list) {System.out.println(elem);
);
}
现在这个方法可以接受任何类型的List了!🎉 因为List
表示"某种类型的List,但我不知道具体是什么类型"。
但是,通配符真正的威力在于它可以与extends
和super
结合使用,这就是我们今天要深入探讨的重点!🔍
三、上界通配符: 📈
3.1 基本概念
``表示"T或者T的某个子类型"。这被称为"上界通配符"(Upper Bounded Wildcard),因为它限定了类型的上界。
举个生活中的例子🌰:想象你有一个动物园,里面有各种动物。List
可以表示"一个包含某种动物(可能是狗、猫、鸟等)的列表"。
3.2 代码示例
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}public void processAnimals(List animals) {for (Animal animal : animals) {System.out.println("处理动物: " + animal);}
}List dogs = new ArrayList<>();
dogs.add(new Dog());
processAnimals(dogs); // 可以正常工作!List cats = new ArrayList<>();
cats.add(new Cat());
processAnimals(cats); // 也可以工作!
3.3 能做什么和不能做什么
可以做的事情:
- 从集合中读取元素(作为Animal类型)
- 调用Animal类的方法
不能做的事情:
-
向集合中添加元素(除了null)
animals.add(new Dog()); // 编译错误! animals.add(null); // 这是唯一允许的添加
为什么?因为编译器不知道实际的类型参数是什么。可能是
List
,也可能是List
,所以为了类型安全,不允许添加。
3.4 实际应用场景
这种通配符特别适合"生产者"场景——即你主要从集合中读取数据。比如:
-
计算集合中所有数字的总和:
public double sumOfList(List list) {double sum = 0.0;for (Number num : list) {sum += num.doubleValue();}return sum; }
-
在图形应用中处理各种形状:
void drawAll(List shapes) {for (Shape shape : shapes) {shape.draw();} }
四、下界通配符: 📉
4.1 基本概念
``表示"T或者T的某个父类型"。这被称为"下界通配符"(Lower Bounded Wildcard),因为它限定了类型的下界。
继续动物园的例子🦁:List
可以表示"一个可以存放Dog及其子类的列表",比如List
或List
。
4.2 代码示例
public void addDogsToList(List list) {list.add(new Dog());// 也可以添加Dog的子类list.add(new Puppy()); // 假设Puppy extends Dog
}List animals = new ArrayList<>();
addDogsToList(animals); // 可以工作List dogs = new ArrayList<>();
addDogsToList(dogs); // 也可以工作List objects = new ArrayList<>();
addDogsToList(objects); // 同样可以!
4.3 能做什么和不能做什么
可以做的事情:
- 向集合中添加T或T的子类元素
- 作为参数传递(消费场景)
不能做的事情:
-
安全地从集合中读取元素(除了作为Object)
Dog dog = list.get(0); // 编译错误! Object obj = list.get(0); // 这是可以的
为什么?因为列表可能是
List
,而你不能保证取出的就是Dog。
4.4 实际应用场景
这种通配符特别适合"消费者"场景——即你主要向集合中添加数据。比如:
-
将多个元素添加到集合中:
public void addNumbers(List list) {for (int i = 1; i <= 10; i++) {list.add(i);} }
-
在GUI应用中添加各种组件:
void addButtons(List components) {components.add(new Button("OK"));components.add(new Button("Cancel")); }
五、PECS原则:生产者用extends,消费者用super �
现在你可能会问:“我什么时候该用extends,什么时候该用super呢?” 🤔
答案就是记住这个简单的口诀:PECS(Producer-Extends, Consumer-Super)
- Producer(生产者):如果你需要一个数据结构提供(生产)元素给你使用,用
extends
- Consumer(消费者):如果你需要一个数据结构接受(消费)你提供的元素,用
super
5.1 PECS示例
假设我们有一个拷贝方法,从一个列表(src)拷贝到另一个列表(dest):
public static void copy(List dest, List src) {for (T item : src) {dest.add(item);}
}
这里:
- src是生产者(我们从中读取数据),所以用
extends
- dest是消费者(我们向其中写入数据),所以用
super
5.2 为什么PECS有效?
这个原则之所以有效,是因为:
-
对于生产者(
extends
):- 你只能从中读取,不能写入(除了null)
- 读取的元素至少是某种特定类型(上界)
-
对于消费者(
super
):- 你可以写入特定类型或其子类
- 只能以Object形式读取元素
六、无界通配符: 🌌
有时候,你只关心泛型类型本身,而不关心它的类型参数。这时可以使用无界通配符``。
6.1 基本用法
public void printListSize(List list) {System.out.println("列表大小: " + list.size());
}
这个方法可以接受任何类型的List,但你只能调用不依赖类型参数的方法(如size(), clear()等)。
6.2 与原生类型的区别
注意List
和原生类型List
是不同的:
List
:这是一个知道自己是泛型但不知道具体类型的列表,是类型安全的List
:这是Java 5之前的原始类型,完全不知道泛型,不安全
6.3 实际应用
无界通配符常用于:
- 当方法实现只需要Object类提供的功能时
- 当类型参数不重要或不可知时
- 作为泛型类中非泛型方法的参数类型
七、通配符在方法签名中的应用 🎯
通配符不仅可以用在变量声明中,还可以用在方法签名中,使API更加灵活。
7.1 方法参数中的通配符
// 更灵活的API设计
public void process(List numbers) { ... }// 比下面这种限制更少
public void process(List numbers) { ... }
7.2 返回类型中的通配符
通常不建议在返回类型中使用通配符,因为这会给方法调用者带来不便。例如:
// 不推荐
public List getNumbers() { ... }// 调用者使用起来不方便
List numbers = getNumbers();
Number num = numbers.get(0); // 可以
Integer i = numbers.get(0); // 编译错误
八、通配符捕获与辅助方法 🕵️♂️
有时候我们需要"捕获"通配符的具体类型,这时可以使用辅助方法。
8.1 通配符捕获问题
public void swap(List list, int i, int j) {Object temp = list.get(i);list.set(i, list.get(j)); // 编译错误!list.set(j, temp); // 编译错误!
}
为什么出错?因为编译器不知道?
具体是什么类型,无法保证类型安全。
8.2 使用辅助方法解决
private static void swapHelper(List list, int i, int j) {E temp = list.get(i);list.set(i, list.get(j));list.set(j, temp);
}public void swap(List list, int i, int j) {swapHelper(list, i, j); // 这里发生了通配符捕获
}
编译器可以推断出辅助方法中的E就是通配符?
的具体类型。
九、通配符与类型参数的区别 🤼
有时候和
看起来很相似,但它们有重要区别:
特性 | 类型参数 `` | 通配符 `` |
---|---|---|
可命名 | 是 (T) | 否 |
多处使用相同类型 | 是 | 否 |
灵活性 | 较低 | 较高 |
适用场景 | 需要引用类型参数 | 只需要一次使用 |
9.1 何时使用哪种
- 当需要在方法中多次引用同一类型时,使用类型参数
- 当只需要一次使用且不需要知道具体类型时,使用通配符
十、高级话题:通配符嵌套与复杂场景 🧩
通配符可以嵌套使用,处理更复杂的场景。
10.1 嵌套通配符示例
// 一个映射,其键是某种类型的列表
Map> complexMap = new HashMap<>();// 一个列表,包含各种类型的列表
List> listOfLists = new ArrayList<>();
10.2 通配符与泛型方法的结合
public static void copyWithFilter(List dest, List src, Predicate filter) {for (T elem : src) {if (filter.test(elem)) {dest.add(elem);}}
}
十一、常见误区与陷阱 🚧
11.1 误区1:认为List
和List
相同
错!List
明确知道元素是Object类型,可以安全添加Object。而List
表示"不知道是什么类型",只能添加null。
11.2 误区2:过度使用通配符
不是所有地方都需要通配符。如果类型信息重要,使用具体类型参数可能更好。
11.3 误区3:忽略编译器警告
当使用通配符时,如果看到编译器警告,一定要理解原因,不要简单地忽略或压制它们。
十二、实战演练:集合工具类 🛠️
让我们实现一个简单的集合工具类,应用所学的通配符知识。
public class CollectionUtils {// 合并两个列表到目标列表public static void merge(List dest,List src1, List src2) {dest.addAll(src1);dest.addAll(src2);}// 找出最大值public static > T max(List list) {if (list.isEmpty()) throw new NoSuchElementException();T max = list.get(0);for (T elem : list) {if (elem.compareTo(max) > 0) {max = elem;}}return max;}// 过滤列表public static List filter(List list, Predicate predicate) {List result = new ArrayList<>();for (T elem : list) {if (predicate.test(elem)) {result.add(elem);}}return result;}
}
十三、总结与最佳实践 🏆
13.1 关键点回顾
- ``:用于从结构中读取(生产者),不能写入(除了null)
- ``:用于向结构中写入(消费者),只能以Object读取
- ``:当类型完全无关紧要时使用
- 记住PECS原则:Producer-Extends, Consumer-Super
13.2 最佳实践
- 优先使用通配符:它们使API更灵活
- 返回类型避免通配符:会给调用者带来不便
- 通配符嵌套要谨慎:太复杂的嵌套会降低可读性
- 合理使用类型参数和通配符:根据是否需要引用类型决定
- 测试边界情况:特别是null值和类型边界
十四、练习题与思考 🤔
为了巩固所学,尝试解决以下问题:
- 编写一个方法,将一个
List
和一个List
中的所有元素相加,返回总和 - 创建一个通用的
addAll
方法,可以将一个列表的所有元素添加到另一个列表中,考虑PECS原则 - 为什么
Collections.max()
方法的签名是这样的?public static > T max(Collection coll)
十五、结语 🌈
恭喜你坚持到了这里!👏 泛型通配符确实是Java中比较复杂的主题,但一旦掌握了它,你就能写出更灵活、更安全的泛型代码。记住,理解extends
和super
的关键在于思考数据的流向——是生产还是消费。
刚开始可能会觉得有点绕,多练习几次就会越来越清晰。就像学骑自行车一样,一开始可能会摔倒几次,但一旦掌握,就再也不会忘记了!🚴♂️
希望这篇文章能帮你彻底理解Java泛型通配符。如果有任何问题,欢迎随时讨论!💬
Happy coding! 💻🎉
推荐阅读文章
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
什么是 Cookie?简单介绍与使用方法
-
什么是 Session?如何应用?
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
如何理解应用 Java 多线程与并发编程?
-
把握Java泛型的艺术:协变、逆变与不可变性一网打尽
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
如何理解线程安全这个概念?
-
理解 Java 桥接方法
-
Spring 整合嵌入式 Tomcat 容器
-
Tomcat 如何加载 SpringMVC 组件
-
“在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”
-
“避免序列化灾难:掌握实现 Serializable 的真相!(二)”
-
如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
-
解密 Redis:如何通过 IO 多路复用征服高并发挑战!
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
“打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
-
Java 中消除 If-else 技巧总结
-
线程池的核心参数配置(仅供参考)
-
【人工智能】聊聊Transformer,深度学习的一股清流(13)
-
Java 枚举的几个常用技巧,你可以试着用用
-
由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
-
如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
-
HTTP、HTTPS、Cookie 和 Session 之间的关系
-
使用 Spring 框架构建 MVC 应用程序:初学者教程
-
有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
-
Java Spring 中常用的 @PostConstruct 注解使用总结
-
线程 vs 虚拟线程:深入理解及区别
-
深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
-
10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
-
探索 Lombok 的 @Builder 和 @SuperBuilder:避坑指南(一)
-
为什么用了 @Builder 反而报错?深入理解 Lombok 的“暗坑”与解决方案(二)
相关文章:
《理解 Java 泛型中的通配符:extends 与 super 的使用场景》
大家好呀!👋 今天我们要聊一个让很多Java初学者头疼的话题——泛型通配符。别担心,我会用最通俗易懂的方式,带你彻底搞懂这个看似复杂的概念。准备好了吗?Let’s go! 🚀 一、为什么我们需要泛型通配符&…...
Scala 入门指南
Scala 入门指南 目录 简介环境搭建基础语法面向对象编程函数式编程集合模式匹配特质隐式转换并发编程与 Java 互操作最佳实践常见问题 简介 Scala 是一种多范式编程语言,结合了面向对象编程和函数式编程的特性。它运行在 JVM 上,与 Java 完全兼容&am…...
GESP2025年3月认证C++八级( 第一部分选择题(11-15))
杨辉三角形: #include <iostream> using namespace std;#define N 35 // 最多支持输出 35 行 int a[N]; // 一维数组,用于存储当前行的杨辉三角数int main() {int n;cin >> n; // 输入要输出的行数for (int i 0; i < n; i) {a[i] …...
Dynamics 365 Business Central Master Data Managerment Setup 主数据管理
#Dynamics 365 BC ERP# #Navision# 引言 在BC中除了之前有一个章节提到的用Code 同步资料, 也可以用内置主数据管理功能来同步资料。 Master Data Management Setup 设置Source Company 为 主要管理主数据的公司 Synchronization Tables 设置需要同步的Table 这…...
深入理解 requestIdleCallback 与大数据加载优化
使用 requestIdleCallback 优化大批量 DOM 操作 —— 以加载 100 万条数据为例 在前端开发中,如果你尝试在短时间内往 DOM 中添加大量元素,比如一次性插入 100 万条数据,页面极有可能卡顿甚至直接崩溃。为了解决这一性能问题,我们…...
【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算
索引运算与NULL值问题详解 不能参与的"部分索引运算"指什么? 这里的"部分索引运算"指的是索引列在某些特定操作或条件下无法被MySQL优化器有效利用的情况,特别是当字段包含NULL值时。主要包括以下几种情况: 1. 比较运…...
STM32 F103 标准库CH452A 4线 数码管驱动芯片显示数码管
公司生产测试需要统一去检查这版CH452A的好坏,网上找了一下没有现成可以用的4线CH452A的驱动程序,所以直接就肝了移植官方的51程序到stm32上面去,亲测可以使用!! 文末有代码 测试图片: 如你所见我测了一堆…...
Vue 和 Spring boot 和 Bean 不同生命周期
一、Vue 组件生命周期 父子组件生命周期顺序: 创建时: 父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted 更新时: 父 beforeUpdate → 子组件更新 → 父 updated。 销毁时: 父 beforeDestroy…...
期货数据API对接实战指南
一、期货数据接口概述 StockTV提供全球主要期货市场的实时行情与历史数据接口,覆盖以下品种: 商品期货:原油、黄金、白银、铜、天然气、农产品等金融期货:股指期货、国债期货特色品种:马棕油、铁矿石等区域特色期货 …...
Flask(2): 在windows系统上部署项目2
4 创建并激活虚拟环境 虚拟环境非常有用,可以将多个项目隔离开来。根据我看的教程,貌似以前有多种创建方式,后来官方自带了。目前我就用官方的方式。 4.1 创建虚拟环境 创建部署文件夹(假如目录为d:\project01),在命令提示…...
Java 中 Synchronized如何保证可见性
在 Java 多线程编程中,可见性问题是指一个线程对共享变量的修改,其他线程能够立即看到。如果没有适当的同步机制,可能会出现线程 A 修改了共享变量的值,但线程 B 仍然使用的是修改前的值,导致程序出现错误。synchroniz…...
33、Python单元测试与pytest框架从入门到精通
Python单元测试与pytest框架从入门到精通 引言 在软件开发领域,完善的测试体系是保证代码质量的生命线。本文将深入探讨Python单元测试的核心技术,从标准库unittest到功能强大的pytest框架,通过20个代码示例展示测试驱动开发(TD…...
mvccc
. MVCC (多版本并发控制) 概念: MVCC 是一种并发控制技术,用于在数据库中实现并发事务的读写操作,同时保证事务的隔离性。MVCC 的核心思想是,在数据库中维护数据的多个版本,每个事务在读取数据时,读取的是…...
ONLYOFFICE深度解锁系列.2-Excel 跨文件数据整合实战指南-可道云的另一个严重bug
一、为什么需要跨文件数据整合? 在企业办公和团队协作中,数据往往分散在不同文件中。传统复制粘贴方式存在三大痛点: 版本混乱:源数据更新后需反复同步 错误风险:手动操作易造成数据偏差 效率低下:多文件…...
如何对Flutter应用程序进行单元测试
Flutter单元测试完全指南:从基础到高级实践 面试求职资源 面试试题小程序:涵盖测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、计算机网络知识、Jmeter、HR面试等内…...
多模态大语言模型arxiv论文略读(二十四)
VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文标题:VCoder: Versatile Vision Encoders for Multimodal Large Language Models ➡️ 论文作者:Jitesh Jain, Jianwei Yang, Humphrey Shi ➡️ 研究机构: SHI Labs…...
前端根据后端返回的excel二进制文件流进行导出下载
需求 在vue2中,后端接口返回一个文件流,前端实现excel文件流导出下载功能。 解决方案 利用axios请求后端接口,把后端返回的blob文件流转为一个临时在线url,然后利用a标签实现导出下载功能。 具体实现步骤 1、封装axios请求拦…...
代码随想录刷题|Day20(组合总数,组合总数2、分割回文串)
回溯算法 Part02 组合总数 力扣题目链接 代码随想录链接 视频讲解 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你…...
【NLP 64、基于LLM的垂直领域【特定领域】问答方案】
找不到生活的答案,就先找自己 —— 25.4.17 一、垂直领域问答 1.特点 ① 问答内容通常不存在于通用语料 ② 回答内容对准确性要求较高,召回要求较低(可以转人工处理) ③ 拓展性和可控性(可以根据需求,增、…...
pytest自动化中关于使用fixture是否影响用例的独立性
第一个问题:难道使用fixture 会不会影响用例独立 ✅ 简单回答: 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的,那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性?…...
嵌入式物联网开发(二)如何创建N32G45的Keil工程并实现串口打印
如何创建N32G45的Keil工程并实现串口打印 打开Keil IDE, 点击菜单栏Project按钮,选择Create New Project,并在弹出的对话框中选择工程目录,并取一个名字,这里取名bootloader:在弹出的对话框中选择我们的对应的芯片型号: N32G452R…...
基于Canal+Spring Boot+Kafka的MySQL数据变更实时监听实战指南
前期知识背景 binlog 什么是binlog 它记录了所有的DDL和DML(除 了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL 的二进制日志是事务安全型的。一般来说开启二进制日志大概会有1%的性能损耗。 binlog分类 MySQL Bi…...
Unity入门笔记(缘更)
内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装: https://unity.cn 2.基础知识 1.层级(Layer…...
SpringAI+DeepSeek大模型应用开发——2 大模型应用开发架构
目录 2.大模型开发 2.1 模型部署 2.1.1 云服务-开放大模型API 2.1.2 本地部署 搜索模型 运行大模型 2.2 调用大模型 接口说明 提示词角色 编辑 会话记忆问题 2.3 大模型应用开发架构 2.3.1 技术架构 纯Prompt模式 FunctionCalling RAG检索增强 Fine-tuning …...
Prometheus thanos架构
Thanos 是一个用于扩展 Prometheus 的高可用性和长期存储的解决方案。它通过整合多个 Prometheus 实例,提供了全局查询、长期存储、以及高可用性的能力。Thanos 的架构主要由以下几个核心组件组成: 1. Sidecar 功能: Sidecar 是与每个 Prom…...
嵌入式软件--stm32 DAY 1
一、STM32概述 1.ARM内核 ARM是一家英国公司。后被日本软银收购。 RISC(精简指令集计算机) 产品:ARM架构处理器,相关外围组件的电路设计方案。 怎么卖 :知识产权授权 只卖方案不卖具体产品 买了如何用 拿到ARM的方案 设计产…...
【家政平台开发(53)】解锁家政平台高可用秘籍:负载均衡与架构部署
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
Kotlin整数相除精度损失roundToInt
Kotlin整数相除精度损失roundToInt import kotlin.math.roundToIntfun main() {val a 0.0fval delta 0.1ffor (i in 0..10) {val r a i * deltaprintln("float${r} toInt${r.toInt()} (0.5 toInt)${(r 0.5).toInt()} round${Math.round(r)} roundToInt${r.roundToInt…...
RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext----RPC源代码分析
RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION函数分析之初始化中的u.ConnSendContext 第一部分: 1: kd> kc # 00 RPCRT4!OSF_CCONNECTION::OSF_CCONNECTION 01 RPCRT4!OSF_CASSOCIATION::AllocateCCall 02 RPCRT4!OSF_BINDING_HANDLE::AllocateCCall 03 RPCRT4!OSF…...
visual studio 2022更改项目名称,灾难性故障(异常来自HRESULT)
系列文章目录 文章目录 系列文章目录前言一、具体步骤二、遇到的问题 前言 在visual studio 2022中,有时候遇到一个很大的工程,我们只是想改写工程名称,而又不想重建项目,如何实现呢? 比如将 Visual Studio 中的 Qt 工…...
用 Deepseek 写的uniapp油耗计算器
下面是一个基于 Uniapp 的油耗计算器实现,包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面: <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…...
【KWDB创作者计划】_KwDB2.2.0深度实践:从存储引擎到物联网场景的多模数据库实战
简介 本文基于KwDB2.2.0最新版本,通过存储引擎原理、跨模计算实战和物联网场景落地三个维度,结合代码示例与实操案例,系统解析KwDB的分布式多模能力。从零搭建物联网数据平台,探索多模数据融合的创新价值,助你掌握新一…...
linux 学习 2.vim学习指南
vim vim是一款功能及其强大的编辑器,我们需要掌握其基本的操作才能数量的使用他 如果你想要功能更加丰富的vim获得代码补全之类的复杂功能,强烈建议你安装一下vimplus,可以参考这里vimplus 官方教程 建议学习的时候直接跟着教程一步步操作…...
深度学习在自动驾驶车辆车道检测中的应用
引言 自动驾驶技术是人工智能领域的一个前沿方向,而车道检测是实现自动驾驶的关键技术之一。通过识别和跟踪车道线,自动驾驶车辆能够保持在车道内行驶,提高行车安全。本文将详细介绍如何使用深度学习技术进行车道检测,并提供一个…...
深度学习-Torch框架-2
八、自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。 1. 基础概念 张量 Torch中一切皆…...
FlinkCDC初始化时报错“IllegalArgumentException: Unexpected input: “异常定位与原理分析
本篇是纯技术文章,是排查线上问题的真实记录。这个异常我在网上没搜到相同案例,所以特此记录下,方便后期回顾。 一、背景 利用FlinkCDC3.0动态监听数据库Schema变更的能力开发了一个生产数据库DDL语句变更审计告警的服务,这两天突然发现服务一直报错,经过4个小时的排查,…...
从代码学习深度学习 - Transformer PyTorch 版
文章目录 前言1. 位置编码(Positional Encoding)2. 多头注意力机制(Multi-Head Attention)3. 前馈网络与残差连接(Position-Wise FFN & AddNorm)3.1 基于位置的前馈网络(PositionWiseFFN)3.2 残差连接和层规范化(AddNorm)4. 编码器(Encoder)4.1 编码器块(Enco…...
多模态大语言模型arxiv论文略读(二十五)
ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文标题:ManipLLM: Embodied Multimodal Large Language Model for Object-Centric Robotic Manipulation ➡️ 论文作者:Xiaoqi Li, Mingxu Zhang…...
LVS+Keepalived+dns高可用项目架构
一、搭建DNS服务 配置主服务器 1.修改核心配置文件 [rootDNS-master ~]# vim /etc/named.conf options { listen-on port 53 { 192.168.111.107;192.168.111.100; }; directory "/var/named"; }; zone "haha.com" IN { ty…...
C#日志辅助类(Log4Net)实现
一、Log4Net类库安装 在解决方案中项目上右键单击,选择“管理NuGet程序包”,在浏览窗口的搜索框输入log4net进行搜索,安装搜索出的第一项,如下图。 二、辅助类实现(Log4NetHelper) using log4net.Appender; using log4net.Config; using log4net.Layout; using log4net…...
【FFmpeg从入门到精通】第二章-FFmpeg工具使用基础
1 ffmpeg常用命令 ffmpeg在做音视频编解码时非常方便,所以在很多场景下转码使用的是ffmpeg,通过 ffmpeg --help可以看到 ffmpeg 常见的命令大概分为6个部分,具体如下。 ffmpeg信息查询部分公共操作参数部分文件主要操作参数部分视频操作参数…...
论文阅读:2022 ACL TruthfulQA: Measuring How Models Mimic Human Falsehoods
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 TruthfulQA: Measuring How Models Mimic Human Falsehoods https://arxiv.org/pdf/2109.07958 https://www.doubao.com/chat/3130551217163266 https://github.com/sylin…...
基于C++(MFC)实现的文件管理系统
基于 MFC 的文件管理系统 第一章 题目解读与要求分析 1 实习题目 实现一个文件系统。 2 功能要求 界面上显示树形目录结构 a)根节点是“我的电脑” b)“我的电脑”下有几个盘符(C、D、E 等)就有几个子节点,递归…...
selenium 实现模拟登录中的滑块验证功能
用python在做数据采集过程中,经常需要用到模拟登录,经常遇到各种图片、文字甚至短信等验证,如果能通过脚本的方便实现验证,就可以自动帮我更高效地收集数据。Selenium 是一个开源的 Web 自动化测试工具,最初是为网站自…...
Oracle 19c部署之数据库软件安装(二)
在完成了Oracle Linux 9的初始化配置之后,我们准备安装Oracle 19c数据库软件。 Oracle数据库支持两种主要的安装方式:图形化安装和静默安装。这两种方法各有优缺点,选择哪种取决于你的具体需求、环境配置以及个人偏好。 图形化安装 图形化安…...
Paramiko 使用教程
目录 简介安装 Paramiko连接到远程服务器执行远程命令文件传输示例 简介 Paramiko 是一个基于 Python 的 SSH 客户端库,它提供了在网络上安全传输文件和执行远程命令的功能。本教程将介绍 Paramiko 的基本用法,包括连接到远程服务器、执行命令、文件传输…...
从EOF到REOF:如何用旋转经验正交函数提升时空数据分析精度?
目录 1. 基本概念与原理2. 应用场景3. 与传统EOF的区别4. 技术实现5. 其他领域中的“REOF”参考资料 REOF 的输入是多个地区在不同时间的气候数据(如温度或降雨量),它的作用是通过旋转计算找出这些数据中最主要的变化规律,输出则是…...
VS-Code创建Vue3项目
1 创建工程文件 创建一个做工程项目的文件夹 如:h5vue 2 cmd 进入文件 h5vue 3 输入如下命令 npm create vuelatest 也可以输入 npm create vitelatest 4 输入项目名称 项目名称:自已输入 回车 可以按键盘 a (全选) 回车: Playwright…...
JESD204B接收器核心实现和系统级关键细节
目录 1.通道偏移 2.弹性缓冲器的实现 3.接受延迟 4.RX端到端延迟 5.计算端到端延迟 6.实现可重复的延迟 1.通道偏移 JESD204B接收器核心已经过验证,其功能具有高达8个字节的通道到通道偏斜。 2.弹性缓冲器的实现 在JESD204B设备中,接收通道对齐弹性缓冲区是在分布式…...
NLP高频面试题(四十七)——探讨Transformer中的注意力机制:MHA、MQA与GQA
MHA、MQA和GQA基本概念与区别 1. 多头注意力(MHA) 多头注意力(Multi-Head Attention,MHA)通过多个独立的注意力头同时处理信息,每个头有各自的键(Key)、查询(Query)和值(Value)。这种机制允许模型并行关注不同的子空间上下文信息,捕捉复杂的交互关系。然而,MHA…...