当前位置: 首页 > 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 开发企业级健康管理项目》、《带你从入…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...