数据结构-初识泛型

写在前:

这一篇博客主要来初步的记录以下泛型的相关内容,内容比较琐碎,就不进行目录的整合,后续可能会对泛型这里进行系统性的梳理,此篇博客主要是对泛型有一个简单的认识与理解,需要知晓的内容。

当我调用func()的时候,进行传递的是一个真实的数据,是一个数值,在有些情况下,我们会想传递一个数据类型过去。

《Java编程思想》对泛型的介绍:一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类。如果要编写可以应用于多种类型的代码,这种刻板的限制就会对代码的舒服很大。

泛型是在JDK1.5引入的新的语法,通俗讲,泛型就是适用于许多许多类型,从代码上讲,就是对类型实现了参数化。

思考:现在需要我们实现一个类,这个类里面有一个数组,将数组实现成通用的【什么类型的数据都可以存放】,也可以根据方法成员返回数组中的某个下标的值。

我们可以编写出以下的代码:

class MyArray1{public Object[] obj = new Object[3];//讲数组定义为Object数组,长度为3,不放数据//提供一个方法,getPos,给一个pos下标,就可以返回pos下标对应的值。public Object getPos(int pos){return obj[pos];}public void setObj(int pos,Object val){obj[pos] = val;}
}
public class Test2 {public static void main(String[] args) {MyArray1 myArray1 = new MyArray1();myArray1.setObj(0,10);myArray1.setObj(2,"hello");myArray1.setObj(3,10.0);double d = (double)myArray1.getPos(3);}
}

但是我们发现,这样的方法并不是通用的:

解决第一个问题:存储数据的时候,什么数据都可存储?

可以在这里加上一个<T>,代表的含义是当前类是一个泛型类。

每次进行获取数据的时候都要进行类型的转换

把类型作为参数进行传递。

1.存储数据的时候,可以帮我们进行自动的类型检查。

2.获取元素的时候,可以帮我们进行类型转换。

以上两步都是在编译的时候,泛型是编译时期的一种机制,在运行的时候没有泛型的概念。

规定:泛型当中,不能去实例化一个泛型类型的数组。

小结:

1.泛型是将数据类型参数化,进行传递。

2.使用<T>表示当前类是一个泛型类。

3.泛型目前为止的优点:数据类型参数化,编译时自动进行类型检查和转换。

规定:泛型当中不能去实例化一个泛型类型的数组。

裸类型:裸类型是一个泛型类没有带着类型实参,例如MyArrayList就是一个裸类型。 

问题:Java到底如何进行编译的?

擦除机制!!

泛型的上界【泛型无下界】

在定义泛型类的时候,有时候需要对传入的类型变量做一定的约束,可以通过类型边界来约束。

观察以上的代码为什么会报错?

我们使用泛型来进行一个数组中最大值的查找,这里出现了报错,具体原因是因为这里的E类型是一个引用类型,所以就不可以通过大于小于号进行比较,引用类型是通过compare方法来进行比较的。

但是这里并没有相关的方法,原因是因为

没有实现接口。:E类型被擦除为Object,Object没有实现对应的接口。

这时就需要我们对E类型进行给《边界》,如果不给边界最终就会被擦除为Object

在这里,<E extends N>这个就叫做泛型的上界,代表将来指定的参数类型一定是实现了这个接口的。

<E extends Number> 代表:E是Number的子类或者是Number本身。

创建一个新的类A,继承Number,此时,就可以确定使用Number的子类,确定泛型的上界。

需要重点注意的内容是泛型有上界,但是泛型是没有下界的。

以上是泛型类,那么是否存在泛型方法?

泛型静态方法:

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

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

相关文章

2. 网络之网络编程

网络编程 文章目录 网络编程1. UDP1.1 DatagramSocket1.1.1 DatagramSocket 构造方法1.1.2 DatagramSocket 方法&#xff1a; 1.2 DatagramPacket1.2.1 DatagramPacket构造方法1.2.2 DaragramPacket方法1.2.3InetSocketAddress API 1.3 UDP回显服务器1.3.1 框架结构1.3.2 读取请…

将图像的锯齿状边缘变得平滑的方法

项目背景 使用PaddleSeg 192x192 模型分割出来的目标有锯齿状边缘&#xff0c;想通过传统算法将这种锯齿状边缘的变得平滑&#xff0c;虽然试了很过方法&#xff0c;但是效果还是不太理想 常用的集中方法 当使用分割算法&#xff08;如分水岭分割、阈值分割等&#xff09;分…

Docker:命令

Docker&#xff1a;命令 1. 创建MySQL的命令解读2. 基础命令3. 案例 查看DockerHub&#xff0c;拉取Nginx镜像&#xff0c;创建并运行Nginx容器4. 命令别名附录 1. 创建MySQL的命令解读 docker run :创建并运行一个容器&#xff0c;-d 是让容器在后台运行--name:给容器起一个名…

使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令

背景 最近面对一个庞大的项目&#xff0c;但是只需要修改某个模块&#xff0c;每次都手搓命令太麻烦了&#xff0c;于是就想着能不能写个脚本来辅助处理这些事情。 解决方案 定制化一键 ESLint&#xff0c;执行文件下载地址&#xff1a; https://github.com/mazeyqian/go-g…

Python 自动化(十六)静态文件处理

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls day01 day02 (testenv) [rootlocalhost projects]# mkdir day03 (testenv) [rootlocalhost projects]# cd day03 (testenv) [rootlocalhost day03]# django-admi…

基于nodejs+vue啄木鸟便民维修网站设计与实现

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

element-plus走马灯不显示

问题描述 依赖正确&#xff0c;代码用法正确&#xff0c;但是element-plu走马灯就是不显示&#xff01;&#xff01; <div class"content"><el-carousel height"150px" width"200px"><el-carousel-item v-for"item in 4&qu…

Android 默认关闭自动旋转屏幕功能

Android 默认关闭自动旋转屏幕功能 接到客户邮件想要默认关闭设备的自动旋转屏幕功能&#xff0c;具体修改参照如下&#xff1a; /vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml - <bool name"def_accelerometer_rotati…

代码随想录图论并查集 | 第六天 1971. 寻找图中是否存在路径 684.冗余连接

代码随想录图论并查集 | 第六天 1971. 寻找图中是否存在路径 684.冗余连接 一、1971. 寻找图中是否存在路径 题目链接&#xff1a;https://leetcode.cn/problems/find-if-path-exists-in-graph/ 思路&#xff1a;典型并查集模板题。 class Solution {int[] father null;pub…

1、Flink基础概念

1、基础知识 &#xff08;1&#xff09;、数据流上的有状态计算 &#xff08;2&#xff09;、框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。 &#xff08;3&#xff09;、事件驱动型应用&#xff0c;有数据流就进行处理&#xff0c;无数据流就不…

【LeetCode热题100】两数之和 C++

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

1 — NLP 的文本预处理技术

一、说明 在本文中&#xff0c;我们将讨论以下主题&#xff1a;1为什么文本预处理很重要&#xff1f;2 文本预处理技术。这个文对预处理做一个完整化、程序化处理&#xff0c;这对NLP处理项目中有很大参考性。 系列文章的后续&#xff1a; 2、NLP文本预处理技术&#xff1a;词干…

Whisper 从0安装教程 windows

这里写自定义目录标题 Whisper 从0安装教程 windows安装过程安装python3.11安装Anaconda在Anaconda里面安装whisper安装 ffmpeg第一次运行whisper检查GPU 一些弯路 Whisper 从0安装教程 windows 因为需要把语音变成文字稿&#xff0c;问了做语言相关的朋友&#xff0c;决定使用…

【深度学习基础】从R-CNN到Fast R-CNN,再到MaskR-CNN,发展历程讲清楚!

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 题目&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是&qu…

【ArcGIS微课1000例】0076:KMZ转换KML的方法

文章目录 ArcGIS转kmzkmz转kmlArcGIS转kmz ArcGIS可以很方便的将dwg,shp、等矢量数据转为kmz。 拓展阅读: 【ArcGIS微课1000例】0075:将AutoCAD(Dwg、Dxf)文件转换为shp、KML(kml、kmz)文件

Python之循环语句

循环普遍存在于日常生活中&#xff0c;同样&#xff0c;在程序中&#xff0c;循环功能也是至关重要的基础功能。 循环在程序中同判断一样&#xff0c;也是广泛存在的&#xff0c;是非常多功能实现的基础 while循环的基础语法 生活中的循环 程序中的循环 只要条件满足 会无限循…

React:JSX语法入门

JSX语法入门及代码 JSX是一种JavaScript的语法扩展&#xff0c;用于在React中描述用户界面的结构。它允许开发者使用类似HTML的语法来创建React元素&#xff0c;使得代码更具可读性和可维护性。JSX将HTML标签和JavaScript代码结合在一起&#xff0c;可以在其中使用JavaScript表…

企业应将三成AI预算用于管理安全风险

本周二&#xff0c;科大讯飞因AI内容安全事件导致股价暴跌&#xff0c;同时也给野蛮生长的生成式人工智能行业敲响了警钟。 今天&#xff0c;基于大语言模型的生成式人工智能的安全风险已经从担忧变成现实&#xff0c;黑客只需要通过一些“有毒内容”&#xff0c;或者发布几个恶…

【EI会议征稿】第四届生物信息学与智能计算国际学术研讨会(BIC 2024)

第四届生物信息学与智能计算国际学术研讨会&#xff08;BIC 2024&#xff09; 2024 4th International Conference on Bioinformatics and Intelligent Computing 2024年第四届生物信息学与智能计算国际学术研讨会 &#xff08;BIC 2024&#xff09;将定于2024年1月26-28日在…