JAVASE
1.泛型
泛型指类型参数化, 在定义期间,不知道调用时会使用什么类型,就可以添加泛型形参,在使用时传入实参固定类型即可。
泛型类: 泛型应用在类上。 一般用在类名后,用尖括号括起来。用大写字母作为泛型参数。
我们可以通过一个实例更好的理解
public class Person<T> {private T idCard;public Person(T idCard) {this.idCard = idCard;}
我们首先定义了一个Person类,并提供泛型<T>,在传入成员变量时,就可以使用泛型来定义成员变量的类型,因为我们不知道在创建对象时会传入什么类型的对象,在提供构造器时,形参的类型就规定成泛型;
public static void main(String[] args) {//测试:创建一个Person对象,需要给泛型参数赋值具体类型Person<String> P = new Person<>("1001");Person<Long> p3 = new Person<>(1001L);//泛型参数只能使用引用类型,不能能赋值八大基本数据类型//实例化过程中,泛型可以只在一边给泛型参数赋值,但是两边的<>不能省略}
在这里我们传入一个测试方法,分别调用构造器创建两个不同类型的Person对象;在类名后添加传入的实际类型就可以。需要注意:传入的实际类型不能是基本数据类型,因为他们没有面向对象的特征;只能传入引用数据类型;比如包装类或字符串类型;
当有一个子类继承带有泛型的父类时,一般需要给泛型传入实际类型
class Student extends Person<Integer> {public Student(Integer idcard) {super(idcard);}
}
需要注意的是,在继承父类之后,需要重写父类的构造方法;
子类在继承带有泛型的父类时,如果子类自己也添加了泛型,可以把泛型传入父类
class Teacher<E> extends Person<E> {public Teacher(E idcard) {super(idcard);}
}
需要注意的是,子类在继承父类后,需要把自己的泛型赋值给父类
如果子类不传入实际类型也不使用泛型,那么子类默认使用Object泛型
class President extends Person {public President(Object idcard) {super(idcard);}
}
2.泛型接口
如果泛型应用在接口上,就成为泛型接口;
public interface MyComparable<T, M> {}
在定义泛型接口时,也可以使用泛型,这个比较接口就传入了两个泛型
class Employee implements MyComparable<Employee, Employee>, Comparator<Employee> {String name;int age;public Employee(String name, int age) {this.name = name;this.age = age;}public String toString() {return "[" + name + ":" + age + "]";}//在我们自己定义的方法中实现比较规则@Overridepublic int mycompare(Employee o1, Employee o2) {return o1.age - o2.age;}public int compare(Employee o1, Employee o2) {return mycompare(o1, o2);}
}
我们定义了一个类来实现两个接口,一个是自定义的比较接口,一个是比较器接口,传入的类型都是定义的Employee类型,之后定义了两个成员变量,年龄和姓名;提供了全参构造器并重写了toString方法,并在我们自己定义的方法中确定比较原则,按照年龄升序,然后重写compare方法,返回值就是我们自己定义的方法,传入o1,o2.
public static void main(String[] args) {Employee[] employees = new Employee[3];employees[0] = new Employee("小张", 18);employees[1] = new Employee("小王", 17);employees[2] = new Employee("小李", 19);
//使用比较器接口,来重新定义比较规则:从泛型的角度来说,在实例化泛型接口时,要给泛型参数传具体类型Comparator c = new Comparator<Employee>() {//重写比较器里的compare方法public int compare(Employee o1, Employee o2) {//调用了自定义的员工类里的比较方法return o1.mycompare(o1, o2);}};Arrays.sort(employees, c);System.out.println(Arrays.toString(employees));}
在main方法里,我们首先建立了Employee类型的数组,并传入了三个值,之后再=在使用比较器接口,新建一个比较器对象,需要使用匿名内部类的方式;重写compare方法,调用主类中自己定义的比较规则方法就可以了,之后对数组进行排序,传入数组和比较器对象;然后对其打印

3.泛型方法
泛型可以应用在方法上,位置位于返回值类型的前面;
public static <T> boolean equals(T t1,T t2){return t1.equals(t2);}
首先定义一个泛型方法,在boolean前面添加泛型,形参也是泛型对象;返回对象调用equals的结果,
class Cat{String name;public Cat(String name){this.name = name;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Cat cat = (Cat) o;return Objects.equals(name, cat.name);}@Overridepublic int hashCode() {return Objects.hashCode(name);}
}
我们在主类Cat中需要重写equals和hashCode方法,可以直接生成,也可以自己撸代码;
public static void main(String[] args) {Cat c1 = new Cat("小黄");Cat c2 = new Cat("小黄");//泛型方法在调用期间不需要传入具体类型,只需要传入具体对象,编译器会自动推断对象的类型//泛型方法调用期间并没有给泛型参数赋值,下面的案例是c1给t1赋值,c2给t2赋值,没有给T赋值。boolean equals = MyUtil.equals(c1, c2);System.out.println("equals: " + equals);}
之后我们可以在main方法中创建两个对象并通过类名调用equals方法,并打印结果。
4.泛型通配符
? 泛型通配符 ,表示不关心调用时传入的类型
/*** 将集合元素打印到控制台上*/public static void print(List<?> list){for(int i = 0;i<list.size();i++){System.out.println(list.get(i));}}
先定义一个方法,将集合中的元素打印到控制台,可以定义一个泛型的形参,使用经典for循环,遍历并打印出集合的每个元素
/*** 上边界的定义 <? extends 具体类名>* 具体调用的时候,可以是上边界的任何子类型或本类型* @param list*/public static void print2(List <? extends Number> list) {for(int i = 0;i<list.size();i++){System.out.println(list.get(i));}}
上边界的定义,指的就是调用方法时,需要传入的类型的形式只能时其本类型或者其子类型,使用上边界时,需要在形参传入泛型时改变<?extends 具体类型(上边界)>之后的方法体不需要改变;
/*** 下边界的定义: <? super 具体类名>* 具体使用的时候,可以是下边界的任何父类型或者本类型*/public static void print3(List <? super Integer> list) {for(int i = 0;i<list.size();i++){System.out.println(list.get(i));}}
下边界的定义,指的就是在调用方法时,需要传入的类型的形式只能是其本类型或其夫类型,传入的泛型需要改变为<? super 具体类型(下边界)>
public static void main(String[] args) {List<Integer> nums = new ArrayList<Integer>();nums.add(1);nums.add(2);nums.add(3);MyUtil.print(nums);//上边界的测试print2(new ArrayList<Long>());print2(new ArrayList<Number>());//下边界的测试print3(new ArrayList<Integer>());print3(new ArrayList<Number>());print3(new ArrayList<Object>());//没有关系
// print3(new ArrayList<Long>());}
在测试时,首先建立一个Integer类型的集合,并添加元素;然后使用print方法打印;
在测试上边界时,定义的上边界是Number,我们传入的泛型可以是子类Long类型,也可以是子类Integer,也可以是本类Number
在测试下边界时,定义的下边界是Integer,我们传入的泛型可以是父类Number类型,也可以是父类Object,也可以是本类Integer
相关文章:
JAVASE
1.泛型 泛型指类型参数化, 在定义期间,不知道调用时会使用什么类型,就可以添加泛型形参,在使用时传入实参固定类型即可。 泛型类: 泛型应用在类上。 一般用在类名后,用尖括号括起来。用大写字母作为泛型参…...
SpringBoot学习之EasyExcel解析合并单元格(三十九)
本解析主要采用反射来修改EasyExcel 返回的默认数据结构实现。 一、待解析表格 二、依赖 全部pom.xml文件如下,仅作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…...
【Kimi学习笔记】C/C++、C#、Java 和 Python
C/C、C#、Java 和 Python 是几种流行的编程语言,它们在设计哲学、用途、语法和运行机制上有所不同。下面我会类比 Java 来解释这些语言的区别: 1. C/C: 类比于 Java,C/C 是一种更接近硬件的低级语言,提供了更多的控制…...
基于贪心算法的路径优化
贪心算法原理 贪心算法的核心原理是在每一步选择中都采取在当前看来最好的选择,以期达到全局最优解。 这种算法不追求整体最优解,而是通过局部最优的选择逐步逼近全局最优解。贪心算法的关键在于构造合适的贪心策略,这种策略需要满足两个基本要素:贪婪选择属性和最优子…...
谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…...
【Android Studio】 创建第一个Android应用HelloWorld
文章目录 创建项目查看AndroidManifest.xml(清单)查看MainActivity.java(Activity)查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml(清单) 查看MainActivity.java(Activity&…...
C++中的错误处理机制:异常
C中的错误处理机制:异常 在软件开发中,错误处理是确保程序稳定性和健壮性的关键环节。C作为一种高级编程语言,提供了比C语言更为灵活和强大的错误处理机制——异常处理。异常处理机制允许程序在运行时检测到错误或异常情况时,能够…...
概率论原理精解【9】
文章目录 集类拓扑空间基 参考文献 集类 C是一个集类(以G的某些子集为元素的集合称为G的集类)。 A i ∈ C , ∩ i 1 n A i ∈ C , 此为有限交封闭 C 所得集类 C ∩ f A_i \in C,\cap_{i1}^nA_i \in C,此为有限交封闭C所得集类C_{\cap f} Ai∈C,∩i1n…...
Pytorch添加自定义算子之(11)-C++应用程序将onnx模型编译并转成tensorrt可执行模型
一、环境 参考 opencv tensorrt cuda visual studio 2019 cmake 二、CMakeLists.txt配置文件 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(segment)set(CMAKE_CXX_FLAGS "-std=c++14 -O1")link_directories(/usr/local/cuda/lib64) # set(OpenCV_DIR "/opt/…...
C++笔记1•C++入门基础•
1.C关键字 C总计63个关键字,C语言32个关键字: 2.命名空间: 在 C/C 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目…...
Linux查看系统线程数
Linux查看系统线程数 查看线程数查看进程内的线程统计线程数 查看线程数 想要查看Linux操作系统允许的最大线程数,可以通过命令 ulimit -a返回配置项的详细说明: # core文件的最大值为100blocks core file size (blocks, -c) 0# 进程的数…...
【Python基础】Python六种标准数据类型中哪些是可变数据,哪些是不可变数据
文章目录 1.基本介绍可变数据类型不可变数据类型2.可变和不可变到底指的是什么?可变(Mutable)不可变(Immutable)总结1.基本介绍 Python 中的六种标准数据类型分为可变数据类型和不可变数据类型。以下是这些数据类型的分类: 可变数据类型 列表(List) 列表是一种有序集…...
android13去掉安全模式 删除安全模式
总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题排查 3.修改方法 3.1方法1 3.2方法2 4.测试 5.彩蛋 1.前言 Android设备上的安全模式是一种诊断模式,当设备无法正常启动时,它会启动到这个模式。在这个模式下,只有系统自带的程序和服务会被运行,所有的第三方…...
LeetCode239 滑动窗口最大值
前言 题目: 239. 滑动窗口最大值 文档: 代码随想录——滑动窗口最大值 编程语言: C 解题状态: 没有思路,困难题,恐怖如斯 思路 本题的关键在于对单调队列的应用,时间复杂度 O ( n ) O(n) O(n)限…...
文件解析漏洞—IIS解析漏洞—IIS7.X
在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文件路径/xx.jpg后面加上/xx.php会将 “/xx.jpg/xx.php” 解析为 php 文件 利用条件 php.ini里的cgi.fix_pathinfo1 开启IIS7在Fast-CGI运行模式下 在 phpstudy2018 根目录创建…...
vue中子传父之间通信(this.$emit触发父组件方法和.sync修饰符与$emit(update:xxx))
文章目录 前言一、通过this.$emit触发父组件方法实现二、.sync修饰符与$emit(update:xxx) 前言 看了几篇帖子,都没有将$emit两种用法汇聚总结在一起。需要额外的浪费时间去查看其他帖子,索性自己总结一下,方便以后查看。 一、通过this.$emit…...
SocketIO 的 html 代码示例
话不多说,以下为前端 SocketIO 代码示例 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>TestConnect</title><base><script src&quo…...
Vercel Error: (Azure) OpenAI API key not found
题意:Vercel 错误:(Azure) OpenAI API 密钥未找到 问题背景: I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…...
SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据
全文链接:https://tecdat.cn/?p37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了…...
常见深度学习优化器总结
Adam 是一种非常流行的优化器,因为它结合了动量和自适应学习率的优点,通常在大多数情况下表现良好。不过,如果你在使用 Adam 时遇到性能问题或希望进一步调优,以下是几种可以考虑的替代优化器: 1. AdamW (Adam with W…...
18-宠物领养系统 mysql+springboot+vue
文档地址 1. 系统简介: 致力于为无家可归的宠物找到一个温暖的家园。作为一个非盈利性的宠物领养平台,目标是通过提供全面的领养信息和专业的宠物照顾知识,促进人们对宠物的了解和关爱。 2. 技术栈: 技术: 基于 B/S 架构 SpringBootMySQL…...
如何借助SEO优化站长工具进行内链优化
如何借助SEO优化站长工具进行内链优化 在当前竞争激烈的网络环境中,搜索引擎优化(SEO)已经成为了提升网站流量的关键手段之一。而在SEO的多种策略中,内链优化尤为重要。内链,也就是网站内部的链接,是搜索引…...
校正协变量的相关:偏相关分析
当你想研究两个变量(X 和 Y)的关系,但担心其他变量(Z)可能干扰这个关系时,偏相关分析 (Partial Correlation) 可以在剔除协变量的影响后,计算 X 和 Y 之间更“纯粹”的关联。 1. 核心定义 偏相关…...
OpenClaw技能开发:为千问3.5-9B扩展自定义功能
OpenClaw技能开发:为千问3.5-9B扩展自定义功能 1. 为什么需要自定义技能? 去年冬天,我接手了一个重复性极高的数据整理工作——每天需要从十几个不同格式的Excel文件中提取特定字段,合并后生成日报。当我第三次在凌晨两点对着屏…...
CarSim与Simulink联合仿真失败排查指南:从COM接口到路径配置
1. 联合仿真失败的常见症状与初步诊断 最近在搭建CarSim和Simulink联合仿真环境时,遇到了不少让人头疼的问题。明明按照教程一步步操作,却总是出现各种莫名其妙的错误。最常见的情况是:Simulink能打开,但一运行仿真就报错…...
17步拆解!一张图看懂AIAgent全流程,轻松掌握大模型应用开发核心!
本文通过一张图详细拆解了AIAgent从用户提问到结果返回的17步全流程,深入探讨了提示词、Agent、大模型、MCP和工具等关键要素在智能体架构中的作用。文章揭示了它们如何共同构建从自然语言意图到智能决策、工具执行再到结果反馈的完整闭环,为开发者提供了…...
【问题修复】ubuntu24.04打不开windows的D盘
目录1 问题描述2 解决方法2.1 重新挂载1 问题描述 在ubuntu24.04上,打不开windows系统中D盘。 2 解决方法 2.1 重新挂载 sudo ntfsfix /dev/nvme0n1p5 sudo mount /dev/nvme0n1p5 /mnt #挂载到/mnt上...
C++ 与 推理流水线:基于 C++ 协程实现预处理、模型计算与后处理的高并发异步编排架构
尊敬的各位技术同行,大家好。今天,我们聚焦一个在现代人工智能应用中至关重要的议题:如何构建高性能、高并发的推理流水线。随着深度学习模型在各行各业的广泛部署,将这些模型高效地集成到生产系统中,实现低延迟、高吞…...
春联生成模型-中文-base:3步生成专业级春节对联
春联生成模型-中文-base:3步生成专业级春节对联 1. 认识你的AI春联助手 春节将至,家家户户都开始准备贴春联。但创作一副既工整又富有寓意的春联并非易事。春联生成模型-中文-base正是为解决这一需求而生的AI工具。 这个模型基于阿里达摩院AliceMind团…...
Cosmos-Reason1-7B在计算机组成原理教学中的应用:图解CPU工作流程
Cosmos-Reason1-7B在计算机组成原理教学中的应用:图解CPU工作流程 计算机组成原理这门课,对很多学生来说,就像在学一门“黑魔法”。课本上那些抽象的指令周期、数据通路、控制器,听起来都懂,但一合上书,脑…...
