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

数据结构之【泛型】

 泛型:定义阶段不明确具体类型,产生对象时明确具体类型。

//Object是Java中的最高参数统一化,能够接受所有的引用类型;
//有了包装类的自动拆装箱之后,Object还能够接收基本类型数值(自动装箱)
public class Pointer {private Object x;private Object y;public void setX(Object x) {this.x = x;}public void setY(Object y) {this.y = y;}public Object getX() {return x;}public Object getY() {return y;}public static void main(String[] args) {//此时x和y都由用户进行输入//第一组为整型Pointer p1=new Pointer();p1.setX(10);p1.setY(20);System.out.println("x="+p1.getX()+",y="+p1.getY());//第二组为字符串Pointer p2=new Pointer();p2.setX("东经108度");p2.setY("北纬18度");System.out.println("x="+p2.getX()+",y="+p2.getY());//第三种情况:用户进行输入//编译阶段不会出现问题,但是运行期间会报错//错误原因:由于用户的异常输入,导致程序类型转换异常,当出现异常后,程序就退出了。Pointer p3=new Pointer();p3.setX(10);p3.setY("北纬100度");int x=(int)p3.getX();int y=(int)p3.getY();System.out.println("x="+x+",y="+y);}
}

针对于某些需要多种类型的输入的情况,一般大家会想到采用Object进行变量类型定义,但是这种定义变量的方式会存在以下问题:

Object虽然可以接收所有的类型,但是Object转为其他类型都需要进行强制类型转换,只要是强转都有类型出错的风险,调用getX和getY方法时,需要根据具体的类型,将Object强转为具体的子类(隐藏的风险,此风险会发生在运行期间)。

因此,需要有新的机制,可以在定义类时,成员变量可以接收多种类型,但是在具体产生对象时明确类型,当有不同类型设置时,编译阶段就能发现错误。

JDK1.5引入的泛型机制。所谓的泛型,就是在定义类或方法时,没有明确参数的类型,而是在使用该类时,明确类型。不需要进行类型强转,编译阶段就会在语法阶段检查类型是否匹配的机制

将泛型比作为类型编译阶段守门员,不会让类型不匹配的问题进入到运行阶段。

1. 泛型类的使用

(1)语法

类名称 <类型参数> {  //类型参数用大写英文字母来代替,任何一个都可以

类型参数  成员变量名称;

...

}

泛型类的使用示例:

public class Point<T> {private T x;private T y;public void setX(T x) {this.x = x;}public void setY(T y) {this.y = y;}public T getX() {return x;}public T getY() {return y;}
}

由于此时变量具体类型未知,因此,此处的T只是一个指代,写什么都行。一般采用大写的单个字母定义。

此处x和y的类型未知,但是可以保证它们是同一个类型,因为使用了相同的类型参数T。

(2)根据泛型类,产生泛型对象

泛型类在定义时,可以不明确成员变量的类型,但是在产生对象时,必须明确类型。

public static void main(String[] args) {//产生泛型类对象//此时产生的是Integer类型的Point对象,此时的x和y就会被定义为整型Point<Integer> point=new Point<>();//此处不需要进行强制类型转换,且能够在编译阶段检查设置类型是否满足要求(编译阶段就会报错,不会在运行期间出错)int x= point.getX();int y= point.getY();}

此处不需要进行强制类型转换,且能够在编译阶段检查设置类型是否满足要求(如果出错,编译阶段就会报错,不会在运行期间出错)。

(3)泛型类使用多个类型参数

泛型类名称<类型参数1,类型参数2,....>{

        类型参数1 变量x;

        类型参数2 变量y;

        //.....

}

 定义:一般使用多个大写字母来定义类型参数

  • T=>一般指代任何类均可
  • E=>一般代表元素Element和T意义差不多,也有使用E来指代异常的意思

K和V一般搭配使用,描述一个键值对的对象。

  • K=>key的意思,不重复的键值
  • V=>value的意思,可以重复
public class NewPoint<T,E> {private T x;private E y;public T getX() { return x; }public void setX(T x) { this.x = x;}public E getY() {return y;}public void setY(E y) {this.y = y;}
}

 产生对象:x和y的类型可以相同,也可以不同

 public static void main(String[] args) {NewPoint<Integer,String> newpoint=new NewPoint<>();newpoint.set}

 2. 泛型方法

 泛型不仅可以定义一个类,也可以单独定义方法。

(1)语法

权限修饰符<类型参数> 方法返回值类型 方法名称(类型参数  形参名称){

        .......

}

泛型方法以自己的类型参数为准,为了区分和泛型类的类型参数,一般若泛型类中存在泛型方法,使用不同的类型参数。(E代表类型不一样)

当泛型类和泛型方法共存时, 泛型方法始终以自己的类型参数为准。

3. 泛型的注意点

  • 泛型只能用在成员域,不能用在静态域(static修饰的内容不能使用泛型)

  • 产生泛型对象时,具体的类型不能使用基本数据类型,要用基本类型的话统一使用包装类

  • 不能直接创建和实例化泛型数组,要使用泛型数组,统一使用Object数组

这三个问题的本质在于泛型只存在于编译阶段,运行阶段没有泛型(类型擦除)

4. 泛型的类型擦除问题

类型擦除:泛型信息只存在于编译阶段,在进入JVM之前,与泛型有关的所有信息会被编译器擦除掉,专业术语称为“类型擦除”。

运行阶段没有任何与泛型相关的信息。

利用反射进行观察:

 泛型只存在于程序的编译阶段,当javac将代码编译为class文件之后,与泛型相关的所有信息全部被擦除掉了。

  • 一般的泛型都会擦除为Object类型;
  • 若存在泛型上限,擦除为对应的泛型上限。

5. 泛型数组的正确定义

相关文章:

数据结构之【泛型】

泛型&#xff1a;定义阶段不明确具体类型&#xff0c;产生对象时明确具体类型。 //Object是Java中的最高参数统一化&#xff0c;能够接受所有的引用类型&#xff1b; //有了包装类的自动拆装箱之后&#xff0c;Object还能够接收基本类型数值&#xff08;自动装箱&#xff09; …...

华为ac无线侧命令行配置思路和步骤

无线侧配置思路&#xff1a; Ap和ac在同一个广播域内&#xff0c;不用配置 option 43 source 源ip回包哪个模式都得配置 Cli配置业务模版流程&#xff1a; 1、 AC控制器上全局配置capwap回包接口地址 1、配置ssid&#xff1a;wifi名称 2、配置安全模版&#xff1a;用户连接密码…...

十六)Stable Diffusion教程:出图流程化

今天说一个流程化出图的案例&#xff0c;适用很多方面。 1、得到线稿&#xff0c;自己画或者图生图加线稿lora出线稿&#xff1b;如果想sd出图调整参数不那么频繁细致&#xff0c;则线稿的素描关系、层次、精深要表现出来&#xff0c;表现清楚。 2、文生图&#xff0c;seed随机…...

SpringBoot全局异常处理源码

SpringBoot全局异常处理源码 一、SpringMVC执行流程二、SpringBoot源码跟踪三、自定义优雅的全局异常处理脚手架starter自定义异常国际化引入封装基础异常封装基础异常扫描器&#xff0c;并注册到ExceptionHandler中项目分享以及改进点 一、SpringMVC执行流程 今天这里叙述的全…...

设计模式——7. 装饰者模式

1. 说明 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不改变对象接口的前提下,动态地将新行为附加到对象上。这种模式是通过创建一个包装(或装饰)对象,将要被装饰的对象包裹起来,从而实现对原有对象功能的增强和扩展。 装饰者模式的主要特点包括:…...

安卓玩机-----反编译apk 修改apk 去广告 去弹窗等操作中的一些常识

安卓机型app的编译与反编译 apk文件的简单说明与解析 -安卓修改apk apk的组成和编译 一 电脑端几种反编译apk工具操作步骤解析 前面几个博文有说明关于反编译apk和apk架构等有些常识.今天对以上做个补充。初学者记住一点。对于一个apk文件使用压缩软件7zip打开可以查看到文件…...

Hoeffing不等式

在李航老师的统计学习方法&#xff08;第一版中&#xff09; H o e f f i n g 不等式 Hoeffing不等式 Hoeffing不等式是这样子给出的 设 X 1 , X 2 , . . . , X N X_1,X_2,...,X_N X1​,X2​,...,XN​是独立随机变量&#xff0c;且 X i ∈ [ a i , b i ] , i 1 , 2 , . . . ,…...

ffmpeg解复用指定pid转推udp

命令 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.168.2.62:5161 ffmpeg -re -i udp://224.2.2.2:4003?fifo_size1024000 -map #5001 -acodec copy -flush_packets 1 -f mpegts udp://192.16…...

Vue组件通信方式

1.props通信 1.1在 Vue 2 中使用 props 通信 注意:props传递的数据是只读的,子组件修改,不会影响父组件 1.1.1.定义 props 在子组件中使用 props 选项来定义要接收的属性 // 子组件 <script> export default {props: {message: String} } </script>1.1.2.传递…...

redis-设置从节点

节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时&#xff0c;会触发同步数据命令 主节点…...

k8s-实战——基于nfs实现动态存储

部署nfs服务 基于Centos7.9版本创建动态存储注意k8s版本应低于v1.24版本高k8s版本ServiceAccount需要手动创建secrets并关联相关sa部署流程 创建NFS共享服务、采用单独的节点用于nfs服务独占安装nfs-utils和rpcbindnfs客户端和服务端都安装nfs-utils包通过部署化脚本安装k8s集群…...

【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统

随着科技的不断发展&#xff0c;虚拟现实技术在各个领域的应用越来越广泛。在养殖业中&#xff0c;VR技术可以帮助养殖户进行家鱼授精实操演练&#xff0c;提高养殖效率和繁殖成功率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先&#xff0c;我们需要了解家鱼授精…...

RocketMQ Promethus Exporter

介绍​ Rocketmq-exporter 是用于监控 RocketMQ broker 端和客户端所有相关指标的系统&#xff0c;通过 mqAdmin 从 broker 端获取指标值后封装成 87 个 cache。 警告 过去版本曾是 87 个 concurrentHashMap&#xff0c;由于 Map 不会删除过期指标&#xff0c;所以一旦有 la…...

Kafka收发消息核心参数详解

文章目录 1、从基础的客户端说起1.1、消息发送者主流程1.2、消息消费者主流程 2、从客户端属性来梳理客户端工作机制2.1、消费者分组消费机制 1、从基础的客户端说起 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId…...

Springboot中Aop的使用

Springboot中使用拦截器、过滤器、监听器-CSDN博客 相比较于拦截器&#xff0c;Spring 的aop则功能更强大&#xff0c;封装的更细致&#xff0c;需要单独引用 jar包。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…...

创建vue3项目、链式调用、setup函数、ref函数、reactive函数、计算和监听属性、vue3的生命周期、torefs的使用、vue3的setup写法

1 创建vue3项目 # 两种方式- vue-cli&#xff1a;vue脚手架---》创建vue项目---》构建vue项目--》工具链跟之前一样- vite &#xff1a;https://cn.vitejs.dev/-npm create vuelatest // 或者-npm create vitelatest一路选择即可# 运行vue3项目-vue-cli跟之前一样-vite 创建的…...

搭建好自己的PyPi服务器后怎么使用

当您成功搭建好自己的 PyPI 服务器后&#xff0c;您可以使用以下步骤来发布和使用您的包&#xff1a; 打包您的代码&#xff1a; 首先&#xff0c;将您的 Python 项目打包成一个发布包。确保您已经在项目根目录下创建了 setup.py 文件&#xff0c;并按照正确的格式填写了项目信…...

Vue3 中使用provide和reject

1、provide 和reject 可以实现一条事件线上的 父传子&#xff0c;父传孙等&#xff1b;相比较 props emits 仅限与父子传参更方便&#xff0c;相较于pinia书写更简单&#xff0c;但是需要注意使用响应式&#xff0c;如果是非响应式的会导致页面更新不及时 父组件 <templat…...

大数据flink篇之一-基础知识

一、起源 2010至2014年间&#xff0c;由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合发起名Stratosphere的研究项目。2014年4月&#xff0c;项目贡献给Apache基金会&#xff0c;成为孵化项目。更名为Flink2014年12月&#xff0c;成为基金会顶级项目2015年9月&#xff…...

No140.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...