数据结构-初识泛型

news2024/11/25 16:48:24

写在前:

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

当我调用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.coloradmin.cn/o/1147213.html

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

相关文章

能量管理系统(EMS):新能源储能行业的智能化大脑

导语&#xff1a;能源管理系统&#xff08;EMS&#xff09;是新能源储能行业中一种关键的智能化技术。它的作用类似于大脑&#xff0c;能够监控、控制和优化能源系统的运行&#xff0c;为储能设施提供高效稳定的能源管理。本文将介绍能量管理系统的基本概念、功能和应用。 一、…

excel技巧

excel技巧 &#x1f353;选中&#x1f353;填充&#x1f353;日期&#x1f352;&#x1f352; 日期快捷方式&#x1f352;&#x1f352; 日期计算&#x1f352;&#x1f352;时间相减 &#x1f353;求和&#x1f353;去除小数点&#x1f353;美化表格&#x1f352;&#x1f352…

手把手教您:思维100秋季选拔赛成绩查询+决赛报名

好消息&#xff01; 2023年上海市“科学小公民”实践展示活动之“思维100”STEM应用能力活动&#xff08;秋季&#xff09;选拔赛成绩可以查询了&#xff0c;并且通过选拔的学员可以报名决赛。 那么具体如何查询思维100秋季选拔赛的成绩呢&#xff1f;思维100秋季决赛如何报名…

MBox肯定会因为回购和销毁将起飞

近期&#xff0c;币安链上的GameFi和元宇宙平台MOBOX宣布推出代币回购和销毁计划&#xff0c;在加密货币市场还处于熊市的现在&#xff0c;消息引起了不少链游打金爱好者和玩家的关注&#xff0c;MOBOX的讨论量也在快速上升。 在近一年多的熊市之中&#xff0c;很多GameFi项目从…

C语言每日一练(二)

单链表经典算法专题 一、 单链表相关经典算法OJ题1&#xff1a;移除链表元素 解法一&#xff1a;在原链表中删除Node.nextnext的节点 typedef struct ListNode ListNode; struct ListNode* removeElements( ListNode* head, int val) {ListNode* pcur head;ListNode* pre h…

Python开源项目周排行 2023年第37周

#2023年第37周2023年10月29日1cogvlm一个强大的开源视觉语言模型&#xff0c;利用视觉专家模块深度整合语言编码和视觉编码&#xff0c;在 10 项权威跨模态基准上取得了 SOTA 性能。目前仅支持英文&#xff0c;后续会提供中英双语版本支持。CogVLM 可以准确描述图像的细节&…

拓扑排序详解

拓扑排序 如果说最短路径是有环图的应用&#xff0c;那么拓扑排序就是无环图的应用。 拓扑排序介绍 我们会把施工过程、生产流程、软件开发、教学安排等都当成- -个项目工程来对待&#xff0c;所有的工程都可分为若干个“活动”的子工程。例如下图是我这非专业人士绘制的一张…

servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header

目录 1、cookie和Session以及Header知识点 2、设置/获取 Cookie 3、设置/获取Session 4、设置/获取Header Cookie —— 客户端机制 Session —— 服务端机制 本篇博客主在用servlet和SpringBoot两种方式分别获取Session和Cookie&#xff0c;用来比较记忆与分析 1、cookie和…

VSCode-C/C++环境配置

0.下载VSCode VSCode官网 Visual Studio Code - Code Editing. Redefined 1.安装VSCode 2.编译器下载与配置 2.1下载编译器安装包 编译器的安装包分为两种一种是在线的一种是离线的,其区别的特点如下 在线安装&#xff08;只是个下载器&#xff0c;打开后还要下载各种东西…

基于Python+pyecharts 实现国内上映电影票房评分可视化分析项目源码

基于Pythonpyecharts 实现国内上映电影票房评分可视化分析项目源码 项目内容 统计2018年在国内上映的所有电影&#xff0c;分别获取上映电影的票房、评分&#xff08;豆瓣、猫眼、时光、imdb&#xff09;、类型、上映日期、演员、导演等数据。利用所获数据绘图&#xff0c;对…

深入Linux内核理解epoll事件轮询机制

文章目录 1、Linux 网络 IO 模型1.1、同步和异步&#xff0c;阻塞和非阻塞同步和异步阻塞和非阻塞两者的组合 1.2、Linux 下的五种 I/O 模型 2、从 Linux 代码结构看网络通信3、Linux 下的 IO 复用编程3.1、文件描述符 FD 4、epoll 高效原理和底层机制分析4.1、从网卡接收数据说…

React-表单受控绑定和获取Dom元素

一、表单受控组件 1.声明一个react状态 说明&#xff1a;useState const [value,setValue]useState("") 2.核心绑定流程 2.1绑定react状态 <div><input value{value}type"text"></input> 2.2绑定onChange事件 说明&#xff1a;e.…

Flutter FittedBox

&#x1f525; 英文单词FittedBox &#x1f525; Fitted 通过有道翻译如下 &#xff1a; Box 通过有道翻译如下 &#xff1a; 对 FittedBox 的理解 我们可以将 FittedBox 理解为合适的盒子&#xff0c;将其它布局放到FittedBox这样一个盒子中&#xff0c;从而实现 盒子里面的…

状态机的设计与实现

写作目的 好久没有写博客进行输出了&#xff0c;是时候需要水一篇了&#xff0c;嘻嘻。 正好项目中使用了状态机&#xff0c;也借此分享一下系统中状态机的项目落地经验。 什么是状态机 以在某宝下单为例&#xff0c;在点击下单后&#xff0c;此时订单就已经创建了&#xff…

STM32H5开发(7)----LCD显示TOF检测数据

STM32H5开发----7.LCD显示TOF检测数据 概述视频教学样品申请源码下载自主模式与连续模式区别硬件准备串口配置 配置串口。IIC配置INT设置配置使能与复位X-CUBE-TOF1串口重定向代码配置TOF代码配置积分时间/曝光时间&#xff08;Integration time&#xff09;主程序状态说明演示…

测试工程师面试题,这些你有没有遇到过呢?

其实在软件测试领域面试题多余牛毛&#xff0c;采取疯狂刷题的方式确实可以解决不少面试中可能碰到的问题&#xff0c;而且可以学到一些知识。但是&#xff0c;有可能刷的面试题一个都问不到。 如何才能解除上述尴尬&#xff0c;一定要记得不要脱离一个核心目的&#xff1a;找…

【redhat9.2】搭建Discuz-X3.5网站

步骤 1.配置软件仓库 2.安装对应的软件 httpd php* mariadb* 3.启动服务 httpd mariadb 4.配置数据库 创建数据库 修改root密码 数据库的 5.传源码包&#xff08;Discuz-X3.5&#xff09; 解压 6.web页面初始化 关闭防火墙 允许http服务通过 修改权限 实…

77 全排列

全排列 题解1 回溯&#xff08;经典思路&#xff09;题解2 正向思路——可作模板 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2…

数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

文章目录 数据结构上机实验1.要求2.二叉树的实现2.1创建一颗二叉树2.2对这棵二叉树进行遍历2.3求二叉树的深度/节点数目/叶节点数目2.4计算二叉树中度为 1 或 2 的结点数2.5判断2棵二叉树是否相似&#xff0c;若相似返回1&#xff0c;否则返回0 3.全部源码测试&#xff1a;Bina…

c语言进阶部分详解(详细解析动态内存管理)

上篇文章介绍了枚举&#xff0c;联合相关的内容&#xff0c;大家可以点击链接进行浏览&#xff1a;c语言进阶部分详解&#xff08;详细解析自定义类型——枚举&#xff0c;联合&#xff08;共用体&#xff09;&#xff09;-CSDN博客 各种源码大家可以去我的github主页进行查找…