Java 核心--泛型枚举
作者:IvanCodes
发布时间:2025年4月30日🤓
专栏:Java教程
各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList
里取出数据,想当然地以为它是个 String
,结果一运行,“啪”!一个 ClassCastException
甩在脸上?😵💫 或者,为了表示几个固定的状态(比如订单处理中、已发货),用了 1
, 2
, 3
这样的“魔法数字”🧙♂️,过段时间自己都忘了哪个数字对应哪个状态?🤦♀️
别担心,这些都是新手(甚至老手!)路上常见的“坑”。好在 Java 提供了两大利器来帮我们填坑:泛型 (Generics) 和 枚举 (Enums)!它们就像给我们的代码上了双重保险,让代码更安全、更易懂。今天,我们就来把这两个“保险”搞明白!🛠️✨
一、 泛型 (<T>
):类型的“占位符”,安全的“万能容器”
还记得那个什么都能装的 Object
类型的 ArrayList
吗?它就像一个不透明的大麻袋 🛍️,苹果 🍎、书 📚、玩具 🧸 都能往里扔。方便是方便,可往外取的时候就麻烦了——你得猜里面是啥,然后强制转换类型。万一猜错了… 运行时就崩了!💥
泛型 就是来解决这个问题的救星!它的核心思想,说白了就是:把类型检查这活儿,从不靠谱的运行时,提前到靠谱的编译时搞定! 并且顺便让代码更好看、更好用。
它是怎么做到的呢?通过引入 类型参数 (Type Parameters)——你可以把它想象成一个类型的“占位符” (常写成 <T>
, <E>
这类大写字母)。在定义类、接口或方法的时候,先用这个占位符代表“未来的某种类型”。等到实际使用的时候,再明确告诉编译器:“嘿,这次这个 <T>
代表的是 String
!”或者“这次 <E>
代表 Integer
!”
1.1 泛型带来的实实在在的好处 ✨
- 类型安全 <✅>:编译器成了你的“类型警察”👮♀️。你往
ArrayList<String>
里塞个Integer
?编译时就给你拦下来!再也不会有运行时的ClassCastException
意外了。 - 告别强制类型转换 <✨>:既然编译器已经帮你把好关了,从
ArrayList<String>
里取出来的元素,它百分百就是String
!再也不用写(String)
这种难看又可能出错的代码了。代码瞬间清爽不少! - 代码更通用、复用性更高 <🔄>:想想
ArrayList<T>
,一份代码就能搞定ArrayList<String>
,ArrayList<Integer>
,ArrayList<YourCustomClass>
… 这就是泛型带来的代码复用魔力。
1.2 怎么玩转泛型?
1.2.1 泛型类 <📦>
最常见的用法,定义一个可以持有特定类型对象的类。
// 一个“类型安全”的盒子
public class Box<T> { // <T> 是类型占位符private T item; // 里面的东西是 T 类型public void setItem(T item) {this.item = item;}public T getItem() {return item;}public static void main(String[] args) {// 创建一个只能装 String 的盒子Box<String> stringBox = new Box<>(); // 明确指定 T 为 StringstringBox.setItem("Hello Generics! <✨>");String message = stringBox.getItem(); // 直接就是 String,无需强转System.out.println(message);// stringBox.setItem(123); // 编译器报错❌!类型警察出动!// 创建一个只能装 Integer 的盒子Box<Integer> integerBox = new Box<>();integerBox.setItem(123);int number = integerBox.getItem(); // 直接就是 int (自动拆箱)System.out.println("Number in box: " + number);}
}
1.2.2 泛型方法 <🔧>
有时候,只是某个方法需要处理泛型,而不是整个类。
public class GenericMethodDemo {// 一个可以打印任何类型数组的泛型方法// 类型参数 <E> 声明在 static 和 返回值 void 之间public static <E> void printArray(E[] inputArray) {System.out.print("Array elements: [ ");for (E element : inputArray) { // element 的类型就是 ESystem.out.print(element + " ");}System.out.println("]");}public static void main(String[] args) {Integer[] intArray = { 1, 2, 3 };String[] stringArray = { "A", "B", "C" };// 调用时通常无需显式指定,编译器会自动推断System.out.println("Integer Array:");printArray(intArray); // 编译器推断 E 是 IntegerSystem.out.println("\nString Array:");printArray(stringArray); // 编译器推断 E 是 String}
}
1.2.3 有界类型参数 <T extends Number>
想让你的泛型更“挑剔”一点?比如,我的盒子只装数字相关的类型!
<T extends UpperBound>
:告诉编译器,这里的T
必须是UpperBound
这个类,或者是它的子类。就像给盒子贴了个标签:“仅限数字!”🔢- 这让你可以在泛型代码内部安全地调用
UpperBound
类定义的方法。
// 一个只能装 Number 及其子类的盒子
class NumericBox<T extends Number> { // 关键字限定上界private T number;// ... setter/getter ...public double getDoubleValue() {// 因为 T 保证是 Number 或其子类,所以可以安全调用 Number 的方法return number.doubleValue();}
}public class BoundedTypeDemo {public static void main(String[] args) {NumericBox<Integer> intBox = new NumericBox<>(); // OK <✅>NumericBox<Float> floatBox = new NumericBox<>(); // OK <✅>// NumericBox<String> strBox = new NumericBox<>(); // 编译错误❌!String 不是 Number}
}
1.2.4 通配符 (Wildcards) <?>
<❓>
通配符这东西,初看可能有点绕 <😵💫>,但它主要用在方法参数或变量声明时,让你写出更灵活的代码,可以接收或引用“某种未知类型”的泛型。
?
(无界通配符): “我啥都能接,但我不知道具体是啥”。List<?> list
可以指向List<String>
,List<Integer>
等等。但为了类型安全,你不能往list
里添加任何元素(除了null
),通常只用于读取或调用Object
的方法。? extends UpperBound
(上界通配符): “我能接UpperBound
及其所有子类型”。List<? extends Number> list
可以指向List<Integer>
,List<Double>
等。同样,不能往里添加元素(除了null
),主要用于安全地读取元素作为UpperBound
类型(生产者场景)。? super LowerBound
(下界通配符): “我能接LowerBound
及其所有父类型”。List<? super Integer> list
可以指向List<Integer>
,List<Number>
,List<Object>
。你可以安全地往list
里添加Integer
或其子类的对象(消费者场景)。
何时深入? 当你开始大量使用泛型集合作为方法参数,并且希望方法能更通用地处理不同类型的集合时,就是研究通配符的好时机。
二、 枚举 (enum
):定义常量集合的“专属俱乐部” 👑🚦
现在换个场景。如果你的程序需要表示一组固定的、有限的值,比如一周七天 📅、红绿灯状态 🚦、订单状态 (待付款、已付款、已发货…) 等等。
老办法可能是用 int
常量 (public static final int MONDAY = 1;
) 或者 String
常量 (public static final String PENDING = "PENDING";
)。但这种方式问题多多:
- 类型不安全🚫:一个期望星期几
int
的方法,你传个100
进去,编译器根本不管! - 可读性差 <😵💫>:代码里看到个数字
3
,谁知道它代表星期三还是订单已发货?得翻文档去… - 没有命名空间 <🏷️>:常量名容易冲突。
- 难以管理 <🛠️>:增加或修改常量可能涉及多处代码。
枚举 (enum
) 就是来终结这种混乱的!它让你创建一个类型安全、含义清晰、管理方便的常量集合。
枚举的核心思想:用一个专属的类型来代表一组有限的、命名的常量,并提供编译时安全检查。
2.1 枚举的闪光点 ✨
- 类型安全 <✅>:编译器强制你只能使用枚举中定义的常量。想给
DayOfWeek
类型的变量赋个TrafficLight.RED
?没门!编译错误! - 代码清晰、可读性爆表 <📖>:
if (order.getStatus() == OrderStatus.SHIPPED)
比if (order.getStatus() == 3)
不知道清晰多少倍! - 代码更健壮、易维护 <🛠️>:常量集中管理。想加个“退款中”的状态?改
enum
就行。 - 不仅仅是常量 <💪>:枚举本质上是特殊的
class
!它可以有构造方法、成员变量、普通方法,甚至可以实现接口!功能远超你的想象!
2.2 玩转枚举
2.2.1 基础款枚举 <🚦>
最简单的用法,就是定义一组常量。
// 定义交通信号灯枚举
public enum TrafficLight { // 使用 enum 关键字RED, YELLOW, GREEN // 常量列表,规范用大写
}public class BasicEnumSwitchDemo {public static void main(String[] args) {TrafficLight currentLight = TrafficLight.GREEN;// 在 switch 中使用枚举是绝配!<🎯>switch (currentLight) {case RED: // case 后面直接用常量名,不用写 TrafficLight.REDSystem.out.println("Stop! <✋>");break;case YELLOW:System.out.println("Caution! <⚠️>");break;case GREEN:System.out.println("Go! <✅>");break;// default 通常可以省略,因为枚举类型是有限的}// 遍历枚举所有常量System.out.println("\nAll light states:");for (TrafficLight light : TrafficLight.values()) { // values() 获取所有常量数组System.out.println("- " + light + " (ordinal: " + light.ordinal() + ")"); // ordinal() 是常量顺序}// 从字符串获取枚举常量TrafficLight lightFromString = TrafficLight.valueOf("RED"); // valueOf(),字符串必须精确匹配System.out.println("\nLight from string 'RED': " + lightFromString);}
}
2.2.2 进阶版枚举:带属性和方法 <👑><⚙️>
让你的常量“活”起来,拥有自己的数据和行为!
// 星期枚举,包含是否是工作日的属性和方法
public enum DayOfWeek {MONDAY(true), // 调用构造方法传入 trueTUESDAY(true),WEDNESDAY(true),THURSDAY(true),FRIDAY(true),SATURDAY(false), // 调用构造方法传入 falseSUNDAY(false);private final boolean isWeekday; // final 实例变量// 构造方法必须是 private (或包级私有)private DayOfWeek(boolean isWeekday) {this.isWeekday = isWeekday;}// 公共方法来获取属性public boolean isWeekday() {return isWeekday;}// 还可以定义其他方法public void printTypeOfDay() {if (isWeekday) {System.out.println(this.name() + " is a weekday. <💼>");} else {System.out.println(this.name() + " is part of the weekend! <🎉>");}}
}public class EnumWithMethodDemo {public static void main(String[] args) {DayOfWeek today = DayOfWeek.SATURDAY;System.out.println("Is today a weekday? " + today.isWeekday()); // falsetoday.printTypeOfDay(); // SATURDAY is part of the weekend! <🎉>System.out.println("\nChecking all days:");for (DayOfWeek day : DayOfWeek.values()) {day.printTypeOfDay();}}
}
三、 泛型 vs. 枚举 & 何时请哪位“大神”? 🤔⚖️
虽然都是好东西,但它们解决的问题完全不同:
- 请泛型出马:当你需要编写能处理各种不同(但类型未知)数据的通用代码时,比如
List<T>
,Map<K,V>
,或者一个通用的排序方法。目标是类型参数化和编译时安全。 - 请枚举出马:当你需要表示一个固定的、有限的、已知的常量集合时,比如星期、方向、状态、颜色等。目标是类型安全、可读性和清晰地表达意图。
简单概括:泛型处理不确定性 (类型);枚举处理确定性 (常量集合)。
四、总结 🏁✨
泛型和枚举,就像给你的 Java 代码装上了安全带和清晰的路标:
- 泛型 (
<T>
): 编译时就帮你挡住类型错误 <🛡️>,省去强制转换的麻烦 <✨>,让代码复用更容易 <🔄>。 - 枚举 (
enum
): 把混乱的常量变成类型安全、易读易维护的“专属俱乐部” <👑>,还能自带属性和方法 <💪>。
我的经验是:一旦你习惯了使用它们,就再也回不去那个充满ClassCastException
和魔法数字的“蛮荒时代”了!😄 它们是写出高质量现代 Java 代码的必备技能。
五、练练手,检验成果!✏️🧠
光听不练等于零,动手试试吧!
⭐ 泛型应用 ⭐
- 创建一个泛型接口
Comparator<T>
,包含一个方法int compare(T o1, T o2)
,用于比较两个T
类型的对象。然后创建一个实现类StringLengthComparator
实现Comparator<String>
,用于比较字符串的长度。 - 编写一个泛型方法
<T> T findFirstMatch(List<T> list, Predicate<T> condition)
,该方法接收一个列表和一个条件(Predicate
是一个函数式接口,可以用 lambda 表达式t -> boolean
),返回列表中第一个满足条件的元素,如果找不到则返回null
。(提示:Predicate<T>
接口有一个test(T t)
方法)
⭐ 枚举应用 ⭐
- 定义一个枚举
Size
,包含常量SMALL
,MEDIUM
,LARGE
。 - 为第 3 题的
Size
枚举添加一个int
类型的minWidth
字段和一个int
类型的maxWidth
字段,并提供构造方法和 getter。例如SMALL(0, 50)
,MEDIUM(51, 100)
,LARGE(101, Integer.MAX_VALUE)
。
⭐ 概念理解 ⭐
- 什么是类型擦除?它是泛型实现的一部分吗?它对我们编写泛型代码有什么影响?(简单说明即可)
- 枚举类型可以
extends
(继承)另一个类吗?可以implements
(实现)接口吗?
六、参考答案 ✅💡
⭐ 泛型应用答案 ⭐
1.Comparator<T>
接口与实现:
import java.util.Comparator; // Java 标准库已有 Comparator 接口,这里是模拟// 泛型接口定义
interface MyComparator<T> {int compare(T o1, T o2);
}// 实现类,比较字符串长度
class StringLengthComparator implements MyComparator<String> {@Overridepublic int compare(String s1, String s2) {// 返回负数表示 s1 < s2, 0 表示相等, 正数表示 s1 > s2return Integer.compare(s1.length(), s2.length());// 或者直接: return s1.length() - s2.length();}
}// 测试
public class ComparatorTest {public static void main(String[] args) {MyComparator<String> comparator = new StringLengthComparator();String str1 = "Java";String str2 = "Generics";int result = comparator.compare(str1, str2); // 比较 "Java" 和 "Generics" 的长度if (result < 0) {System.out.println("'" + str1 + "' is shorter than '" + str2 + "'");} else if (result > 0) {System.out.println("'" + str1 + "' is longer than '" + str2 + "'");} else {System.out.println("'" + str1 + "' and '" + str2 + "' have the same length.");}}
}
2.查找第一个匹配元素的泛型方法:
import java.util.List;
import java.util.Arrays;
import java.util.function.Predicate; // Java 8 的函数式接口public class FindFirstMatchDemo {public static <T> T findFirstMatch(List<T> list, Predicate<T> condition) {if (list == null || list.isEmpty() || condition == null) {return null;}for (T item : list) {if (condition.test(item)) { // 使用 Predicate 的 test 方法判断条件return item; // 找到第一个满足条件的,立即返回}}return null; // 遍历完都没找到}public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 查找第一个长度大于 4 的名字String longName = findFirstMatch(names, name -> name.length() > 4);System.out.println("First name longer than 4 chars: " + longName); // CharlieList<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 查找第一个偶数Integer firstEven = findFirstMatch(numbers, num -> num % 2 == 0);System.out.println("First even number: " + firstEven); // 2// 查找第一个大于 10 的数 (找不到)Integer greaterThan10 = findFirstMatch(numbers, num -> num > 10);System.out.println("First number > 10: " + greaterThan10); // null}
}
⭐ 枚举应用答案 ⭐
3.Size
枚举定义:
public enum Size {SMALL,MEDIUM,LARGE
}
4.带宽度范围的 Size
枚举:
public enum Size {SMALL(0, 50),MEDIUM(51, 100),LARGE(101, Integer.MAX_VALUE); // 使用 Integer.MAX_VALUE 表示无上限private final int minWidth;private final int maxWidth;private Size(int minWidth, int maxWidth) {this.minWidth = minWidth;this.maxWidth = maxWidth;}public int getMinWidth() {return minWidth;}public int getMaxWidth() {return maxWidth;}// 可以添加一个方法来判断某个宽度属于哪个 Sizepublic static Size getFittingSize(int width) {for (Size size : values()) {if (width >= size.getMinWidth() && width <= size.getMaxWidth()) {return size;}}// 理论上,如果定义完整,总能找到一个,但可以加个默认或抛异常return SMALL; // 或者抛出 IllegalArgumentException}
}// 使用示例
public class SizeDemo {public static void main(String[] args) {Size s = Size.MEDIUM;System.out.println("Medium min width: " + s.getMinWidth()); // 51System.out.println("Medium max width: " + s.getMaxWidth()); // 100int currentWidth = 75;Size fitting = Size.getFittingSize(currentWidth);System.out.println("Width " + currentWidth + " fits in size: " + fitting); // MEDIUM}
}
⭐ 概念理解答案 ⭐
5.类型擦除 (Type Erasure):是的,它是 Java 泛型实现的一部分。为了兼容没有泛型的老代码,Java 编译器在编译后会“擦除”掉大部分泛型的类型信息(类型参数会被替换成它们的上界,通常是 Object
)。这意味着在运行时,JVM 其实并不知道 ArrayList<String>
和 ArrayList<Integer>
的区别(它们都是 ArrayList
)。
影响:
- 我们不能在运行时获取泛型参数的实际类型(如
list instanceof ArrayList<String>
是非法的)。 - 不能创建泛型数组(如
new T[]
是不允许的,通常用new Object[]
再强转)。 - 不能实例化类型参数(如
new T()
是不行的,除非有特殊约束如Class<T>
)。 - 静态上下文中不能使用类的类型参数。
枚举的继承与实现:
- 不能
extends
另一个类 🚫:所有的枚举都隐式地继承自java.lang.Enum
类,由于 Java 是单继承的,所以枚举不能再继承其他类。 - 可以
implements
接口 ✅:这是一个非常强大的特性!枚举可以实现一个或多个接口,使得不同的枚举常量可以有不同的行为实现(通常结合接口方法在每个常量内部匿名实现,或者定义一个统一的实现)。
恭喜你又解锁了 Java 的两个重要技能!泛型和枚举在实际项目中应用非常广泛,多加练习,它们会让你的代码水平更上一层楼!🚀 如果觉得这篇笔记有帮助,点赞👍、收藏⭐、关注就是对我最好的肯定!谢谢大家!💖
相关文章:
Java 核心--泛型枚举
作者:IvanCodes 发布时间:2025年4月30日🤓 专栏:Java教程 各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList 里取出数据…...
使用skywalking进行go的接口监控和报警
安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …...
基于Docker的Elasticsearch ARM64架构镜像构建实践
一、前言 Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次…...
【Token系列】14|Prompt不是文本,是token结构工程
文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…...
在宝塔面板中安装OpenJDK-17的三种方法
title: 在宝塔面板中安装OpenJDK-17的三种方法 date: 2025-4-30 categories: 技术教程 tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少 OpenJDK-17(例如搭建 Minecraft 1.17 服务器时),本文提供三种解决方…...
瑞昱点屏芯片RTD2785T带旋转功能
一、产品概述 RTD2785T是瑞昱半导体(Realtek)推出的新一代高性能显示驱动芯片,专为高端显示器、嵌入式系统、工业控制及专业影像设备设计。该芯片集成多接口输入(HDMI、DP、DVI、VGA)与多种输出接口(eDP、…...
蓝桥杯Python(B)省赛回忆
Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…...
自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】
一、✨ 引言 随着三维重建技术的飞速发展,NeRF(Neural Radiance Fields)与 3D Gaussian Splatting(3DGS)等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…...
为Mac用户定制的云服务器Vultr 保姆级教程
以下是专为 Mac 用户 定制的 Vultr 保姆级教程,涵盖从注册、部署服务器到常见问题解决的全流程指南,配合实际案例和故障排查,确保流畅使用。 一、Vultr 基础介绍 1.Vultr 是什么? Vultr 是一家美国云计算服务商,提供…...
广州创科——湖北房县汪家河水库除险加固信息化工程
汪家河水库 汪家河水库位于湖北省房县,建于1971年,其地利可谓是天公之作,东西二山蜿蜒起伏,山峰相连,峰峰比高,无有尽头,东边陡峭,西边相对平坦,半山腰有一条乡村道路&am…...
LeetCode392_判断子序列
LeetCode392_判断子序列 标签:#双指针 #字符串 #动态规划Ⅰ. 题目Ⅱ. 示例 0. 个人方法官方题解一:双指针官方题解二:动态规划 标签:#双指针 #字符串 #动态规划 Ⅰ. 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序…...
力扣第447场周赛
这次终于赶上力扣的周赛了, 赛时成绩如下(依旧还是三题 ): 1. 统计被覆盖的建筑 给你一个正整数 n,表示一个 n x n 的城市,同时给定一个二维数组 buildings,其中 buildings[i] [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。 如…...
kotlin中Triple的作用
在 Kotlin 里,Triple 是标准库提供的一个类,其作用是创建一个包含三个元素的不可变容器。以下是关于它的详细介绍: 基本作用 Triple 类让你能够把三个不同类型的值组合成一个单一对象,方便在函数间传递或者存储这三个相关的值。…...
jmeter读取CSV文件中文乱码的解决方案
原因分析 CSV文件出现中文乱码通常是因为文件编码与JMeter读取编码不一致。常见场景: 文件保存为GBK/GB2312编码,但JMeter以UTF-8读取。文件包含BOM头(如Windows记事本保存的UTF-8),但JMeter未正确处理。脚本读取文…...
Mysql查询异常【Truncated incorrect INTEGER value】
文章目录 异常原因分析1、数据类型不一致2、数据长度超长3、数据格式要正确 处理方案模拟案例创建表数据查询 异常 在执行MySQL的语句时,在控制台报错如下所示。 Data truncation: Truncated incorrect INTEGER value 原因分析 1、数据类型不一致 必须要保证数据…...
vue+django农产品价格预测和推荐可视化系统[带知识图谱]
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! ✅编号:D010 vue django 前后端分离架构搭建的系统带有推荐算法、价格预测、可视化、知识图谱数据从爬虫获取可以更新到最…...
2025年天梯题解(L1-8 + L2)
L1-112 现代战争 题目 既然是从大到小轰炸,将所有点存储为三元组(value, x, y)。 排序之后, 记录行列被轰炸的编号,进行 k 次挑选即可。 #include <bits/stdc.h> using namespace std;constexpr int MAXN 1000; struct …...
AndroidStudio生成AAR
Android Studio 2024.3 版本。如何生成 AAR 文件呢? 操作步骤 1、菜单栏,找到 Build 2、清除项目 Clean Project 3、构建项目 Assemble Project生成 AAR 路径 在 我们构建 lib 库下面。 build/outputs/aar/ xxxx下面截图为证: 我的…...
Vue3 后台管理系统模板
Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板,集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 🚀 基于 Vue3 最新技术栈开…...
RPG4.设置角色输入
这一篇是进行玩家移动和视角移动的介绍。 1.在玩家内进行移动覆写 virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override; 2.创建增强输入资产的变量创建 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "CharacterD…...
生产模块-备货生产
特点 从狭义的角度来看,备货生产场景主要出现在产品定制化需求低,产品工艺流程稳定可以大批生产,市场行情可预测的企业。为了实现订单快速交付,缩短交货周期,企业往往会结合公司历史订单数据和当前市场情况安排提前生产…...
GRE隧道
1.在锐捷网络设备中,tunnel mode gre ip 和 tunnel mode gre multipoint 是两种不同的 GRE(Generic Routing Encapsulation)隧道模式,主要区别在于连接拓扑和使用场景: 1. tunnel mode gre ip(点到点 GRE …...
ASP.NET MVC 入门与提高指南六
31. 事件驱动架构与 MVC 集成 31.1 事件驱动架构概念 事件驱动架构(Event - Driven Architecture,EDA)是一种软件设计模式,系统中的组件通过发布和订阅事件来进行通信。在这种架构中,当某个事件发生时,相…...
【MongoDB篇】MongoDB的文档操作!
目录 引言第一节:C - Create - 创建文档 (Insert) 👶➕第二节:R - Read - 读取文档 (Query) 📚👀第三节:U - Update - 更新文档 (Update) 🔄✍️第四节:D - Delete - 删除文档 (Dele…...
详解具身智能机器人开源数据集:RoboMIND
一、RoboMIND基础信息 RoboMIND 发布时间:2024年12月 创建方:国家地方共建具身智能机器人创新中心与北京大学计算机学院联合创建。 所使用的机器人:单臂机器人(Franka Emika Panda 、UR5e )、双臂机器人(…...
施磊老师rpc(一)
文章目录 mprpc项目**项目概述**:深入学习到什么**前置学习建议**:核心内容其他技术与工具**项目特点与要求**:**环境准备**: 技术栈集群和分布式理论单机聊天服务器案例分析集群聊天服务器分析分布式系统介绍多个模块的局限引入分…...
视觉问答大模型速递:Skywork-R1V2-38B
Skywork-R1V2-38B速读 一、模型概述 Skywork-R1V2-38B是一种最先进的开源多模态推理模型,在多项基准测试中表现卓越。它在MMMU测试中以73.6%的得分位居所有开源模型之首,在OlympiadBench测试中以62.6%的得分大幅领先于其他开源模型。此外,R…...
Spring Boot 中集成 Kafka 并实现延迟消息队列
在 Spring Boot 中集成 Kafka 并实现延迟消息队列,需要结合 Kafka 的基础功能与自定义逻辑来处理延迟投递。以下是完整的实现步骤和示例代码,涵盖配置、生产者、消费者、延迟队列设计和消息重试机制。 一、环境准备与依赖配置 添加依赖 在 pom.xml 中添加 Spring Kafka 依赖:…...
【算法学习】哈希表篇:哈希表的使用场景和使用方法
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在之前学习数据结构时我们就学习了哈希表的使用方法,这里我们主要是针对哈希表的做题方法进行讲解,都是leetcode上的经典…...
(51单片机)LCD显示红外遥控相关数据(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)
前言: 本次Timer0模块改装了一下,注意!!! 演示视频: 红外遥控 源代码: 如上图将9个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安…...
农产品园区展示系统——仙盟创梦IDE开发
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>农业大数据平台</title><style>* {margi…...
Copilot:您的AI伴侣-微软50周年系列更新
回顾微软五十年来持续创新带来的深远影响,比尔盖茨当年"让每张办公桌、每个家庭都拥有电脑"的宏伟愿景至今仍激励着我们。微软AI团队正秉承同样的精神,打造属于每个人的AI伙伴——Copilot。 这意味着什么?它是什么模样?…...
【人工智能】深入探索Python中的自然语言理解:实现实体识别系统
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…...
Steam安装下载及新手注册
📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…...
Gradio全解20——Streaming:流式传输的多媒体应用(1)——流式传输音频:魔力8号球
Gradio全解20——Streaming:Streaming:流式传输的多媒体应用(1)——流式传输音频:魔力8号球 前言本篇摘要20. Streaming:流式传输的多媒体应用20.1 流式传输音频:魔力8号球20.1.1 工作原理20.1.…...
Netflix系统架构解析
Netflix系统架构解析 Netflix架构旨在高效可靠地同时为数百万用户提供内容。以下是其特性和组件的详细分析。 是否曾好奇Netflix如何让您目不转睛地享受无中断的流畅播放体验?幕后功臣正是Netflix架构,它负责提供吸引全球观众的无缝流媒体体验。Netflix的…...
宝塔面板运行docker的jenkins
1.在宝塔面板装docker,以及jenkins 2.ip:端口访问jenkins 3.获取密钥(点击日志) 4.配置容器内的jdk和maven环境(直接把jdk和maven文件夹放到jenkins容器映射的data文件下) 点击容器-->管理-->数据存储卷--.把相…...
【计算机视觉】目标检测:深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南
深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南 技术架构与设计哲学核心设计理念关键技术组件 环境配置与安装硬件建议配置详细安装步骤 实战流程详解1. 自定义数据集准备2. 模型配置与训练3. 模型评估与推理 核心功能扩展1. 自定义模型架构2. 混合精度…...
Notepad编辑器实现换行符替换
在不同的Note编辑器中,批量把换行替换为空的方法有所不同,以下是常见编辑器的操作方法: Notepad 打开文件后,按CtrlH打开“查找和替换”对话框,在“查找”字段中输入\r\n,在“替换为”字段中输入一个空格…...
【数据通信完全指南】从物理层到协议栈的深度解析
目录 1. 通信技术演进与核心挑战1.1 从电报到5G的技术变迁1.2 现代通信系统的三大瓶颈 2. 通信系统架构深度解构2.1 OSI七层模型运作原理2.2 TCP/IP协议栈实战解析 3. 物理层关键技术实现3.1 信号调制技术演进路线3.2 信道复用方案对比 4. 数据传输可靠性保障4.1 CRC校验算法数…...
SpringBoot多工程项目微服务install时如何不安装到本地仓库
在 Spring Boot 微服务项目中,比如各业务微服务模块由于不存在相互依赖度的问题,因此执行maven install时无需安装到本地仓库,但仍然需要参与构建(如 mvn compile 或 mvn package)。公共模块(如辅助工具…...
强化学习_Paper_2017_Curiosity-driven Exploration by Self-supervised Prediction
paper Link: ICM: Curiosity-driven Exploration by Self-supervised Prediction GITHUB Link: 官方: noreward-rl 1- 主要贡献 对好奇心进行定义与建模 好奇心定义:next state的prediction error作为该state novelty 如果智能体真的“懂”一个state,那…...
iview内存泄漏
iview在升级到view-design之前,是存在严重的内存泄漏问题的,而如果你在项目中大量使用了iview组件,就可能面临大量的升级工作要做,因为样式很多是不兼容的。 我们今天就看一下iview的源码,看看到底问题在哪里ÿ…...
【Hive入门】Hive高级特性:事务表与ACID特性详解
目录 1 Hive事务概述 2 ACID特性详解 3 Hive事务表的配置与启用 3.1 启用Hive事务支持 3.2 创建事务表 4 Hive事务操作流程 5 并发控制与隔离级别 5.1 Hive的锁机制 5.2 隔离级别 6 Hive事务的限制与优化 6.1 主要限制 6.2 性能优化建议 7 事务表操作示例 7.1 基本…...
Modbus转PROFIBUS网关:电动机保护新突破!
Modbus转PROFIBUS网关:电动机保护新突破! 在现代工业自动化领域,Modbus RTU和PROFIBUS DP是两种常见且重要的通讯协议。它们各自具有独特的优势和应用场景,但在实际工程中,我们常常需要将这两种不同协议的设备进行互联…...
大数据应用开发和项目实战-Seaborn
设计目标 seaborn 建立在 matplotlib 之上,专注于统计数据可视化,简化绘图过程,提供高级接口和美观的默认主题 Seaborn的安装: 1.pip install seaborn -i 2.conda install seaborn (清华源:https://pypi.t…...
弹窗探索鸿蒙之旅:揭秘弹窗的本质与奥秘
嘿,小伙伴们!👋 今天我们要一起探索那些在日常应用中无处不在的小精灵——弹窗!💬 🤔 弹窗到底是什么? 简单来说,弹窗就是应用程序中突然冒出来的交互元素,它们像…...
“技术创新+全球视野”良性驱动,首航新能的2025新征程正式起航
撰稿 | 行星 来源 | 贝多财经 近日,备受瞩目的“2025年光伏第一股”深圳市首航新能源股份有限公司(301658.SZ,下称“首航新能”)对外发布了上市后的首份年报,交出了一份量质齐升的业绩答卷,构筑更加强大的…...
黑群晖Moments视频无缩略图,安装第三方ffmpeg解决
黑群晖Moments视频无缩略图,安装第三方ffmpeg解决 1. 设置套件来源 黑群晖Moments视频无缩略图,安装第三方ffmpeg解决 基于这个文章,补充一下: 1. 设置套件来源 设置套件来源时(http://packages.synocommunity.com),…...
工业控制「混合架构」PK大战 —— 神经网络 + MPC vs 模糊 PID+MPC 的场景选型与实战指南
1. 引言 在工业控制领域,传统的 PID 控制器因其结构简单、稳定性好而被广泛应用,但面对复杂非线性系统时往往力不从心。模型预测控制(MPC)作为一种基于模型的先进控制策略,能够有效处理多变量、多约束问题,…...