数据结构之【泛型】

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

//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. 泛型数组的正确定义

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/87108.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门级制作电子期刊的网站推荐

随着数字化时代的到来&#xff0c;越来越多的人开始尝试制作自己的电子期刊。如果你也是其中的一员&#xff0c;那么这篇文章可以帮助你制作电子期刊。无论是初学者还是有一定经验的制作者&#xff0c;都能快速完成高质量的电子期刊制作 小编经常使用的工具是-----FLBOOK在线制…

修改vscode底部栏背景和字体颜色

修改vscode底部栏背景和字体颜色 如图&#xff1a; 首先打开齿轮&#xff0c;打开设置搜索workbench.colorCustomizations,然后点击编辑setting.json修改setting.json内内容 "workbench.colorCustomizations": {"statusBar.foreground": "#FFFFFF…

【C++】C++的类型转换

C的类型转换 一、C语言中的类型转换二、C的类型转换1、static_cast2、reinterpret_cast3、const_cast4、dynamic_cast 三、RTTI 一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与…

【力扣每日一题】2023.9.23 树上的操作

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这是一道程序设计类的题目&#xff0c;题目比较长&#xff0c;我稍微概括一下。 构造函数中给我们一个数组&#xff0c;第i个元素表示第…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

牛客java训练题 day1

9.24 day1 Q 1. this 指针是用来干什么的&#xff1f; 2.基类和派生类分别是指什么&#xff1f; 3.为什么方法中不能写静态变量 4. 解释一下ASCII码和ANSI码和两者的区别 5.简述j ava.io java.sql java.awt java.rmi 分别是什么类型的包 6. 看下面一段代码&#xff1a;…

Ubuntu安装RabbitMQ server - 在外远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

安装OpenSearch

title: “安装opensearch” createTime: 2021-11-30T19:13:4508:00 updateTime: 2021-11-30T19:13:4508:00 draft: false author: “name” tags: [“es”,“安装”] categories: [“OpenSearch”] description: “测试的” 说明 基于Elasticsearch7.10.2 的 opensearch-1.1.…

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama 2进行微调是我们常用的一个方法&#xff0c;但是在微调时会遇到各种各样的问题&#xff0c;所以在本文中&#xff0c;将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的&#xff0c;大多数注释都是针对所涉及的开源库以及所使用的方法和…

【工作记录】springboot集成aop实现日志@20230918

springboot集成aop实现日志 1. 添加依赖 <!-- aop 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2. 定义注解 Target(ElementType.METHOD)…

windows 安装 MySQL 绿色版

windows 安装 MySQL 绿色版 下载 官网&#xff1a; MySQL下载页面&#xff1a; MySQL直接下载链接&#xff1a;https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.34-winx64.zip 安装 将下载的mysql.zip文件解压缩到指定目录 搜索 cmd 并以管理员身份运行 切换到…

【微信小程序开发】宠物预约医疗项目实战-注册实现

【微信小程序开发】宠物预约医疗项目实战-注册实现 第二章 宠物预约医疗项目实战-注册实现 文章目录 【微信小程序开发】宠物预约医疗项目实战-注册实现前言一、打开项目文件二、编写wxss代码2.1 什么是wxss2.2 配置主程序全局样式 三. 在sign文件下的wxml文件中编写如下代码并…

数字森林:无人机航测技术在林业调查中的应用

林业调查是林业工作的基础&#xff0c;对于森林资源的管理、规划、保护、经济发展和农业种植等方面都具有重要的意义。传统林业调查主要依赖人工进行&#xff0c;存在工作效率低、数据精度低、数据分析困难、受地形限制、无法实时监测等缺陷。 随着科技的不断发展&#xff0c;无…

最新Python大数据之Excel进阶

文章目录 Excel图表类型了解有哪些图表类型 Excel图表使用图表的创建方式利用固定数据区域创建图表编辑数据系列添加数据标签格式化图表 Excel数据透视表数据透视表对原始数据的要求创建数据透视表数据透视表字段布局将数据透视图变成普通图表 Excel图表类型 为了揭示数据规律…

Open3D 进阶(11)使用GMM-Tree算法对点云配准

GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、

Windows 10 + Jenkins 2.4 安装插件时https 的证书问题及解决

本篇面临与解决的问题 本篇是在 Windows 10中安装Jenkins 2.414.1 &#xff0c; 在安装完成之后安装一些需要的插件&#xff0c; 可以在浏览器端安装插件的时候&#xff0c; 总是不成功&#xff0c; 控制台报以下错误&#xff1a; SEVERE h.model.UpdateCenter$DownloadJob#r…

润和软件HopeStage与华宇信息TAS应用中间件完成产品兼容性互认证

近日&#xff0c;江苏润和软件股份有限公司&#xff08;以下简称“润和软件”&#xff09;HopeStage 操作系统与北京华宇信息技术有限公司&#xff08;以下简称“华宇信息”&#xff09;TAS应用中间件软件完成产品兼容性测试。 测试结果表明&#xff0c;企业级通用操作系统Hope…

成都优优聚美团代运营具备专业团队!

美团代运营是美团旗下的一项服务&#xff0c;旨在帮助商家解决运营难题&#xff0c;提升业务效率和销售额。美团代运营的优势在于多方面&#xff0c;以下将详细介绍。 首先&#xff0c;美团代运营拥有庞大的流量入口。作为中国领先的消费服务平台&#xff0c;美团拥有海量的用户…

字符函数和字符串函数(C语言进阶)

字符函数和字符串函数 一.求字符串长度1.strlen 二.长度不受限制的字符串函数介绍1.strcpy2.strcat3.strcmp 前言 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那…

百度SEO优化技巧大揭秘(提高网站排名的必备SEO技术)

SEO优化技术介绍&#xff1a; SEO优化技术是指通过对网站的结构、内容、链接等方面进行优化&#xff0c;提高网站在搜索引擎中的排名&#xff0c;从而增加流量、提升品牌知名度和销售额。目前&#xff0c;在众多搜索引擎中&#xff0c;百度占据了国内搜索引擎市场的主导地位&a…