【从零开始学习JAVA | 第二十五篇】泛型

news2024/11/18 3:45:59

目录

前言:

泛型:

额外拓展:

总结:


前言:

        本文将详细介绍之前我们在JAVA 中一直在讲的泛型,各位感兴趣的同学可以点击进来观看。

泛型:

        泛型是一种编程概念,它允许在定义类、接口或方法时使用类型参数,这样可以在使用时指定实际的类型。通过使用泛型,可以创建可重用、类型安全的代码,同时提高代码的灵活性和可读性。

        泛型的主要目的是在编译时提供类型检查,以确保类型的一致性和安全性。它允许在不同的场景中使用相同的代码,而无需为每种类型都编写单独的实现。泛型代码在运行时会被擦除为非泛型形式,这种机制称为类型擦除。

        在Java中,泛型使用尖括号(<>)来指定类型参数。例如,可以定义一个泛型类List<E>,其中E是类型参数,表示列表中的元素类型。使用List<String>创建一个字符串类型的列表,使用List<Integer>创建一个整数类型的列表,它们都是相同的泛型类的实例,但元素类型不同。

        泛型还可以用于方法和接口的定义。在方法中使用泛型参数可以使方法适用于不同类型的数据,而无需为每种数据类型编写不同的方法。接口中的泛型参数可以在实现接口时指定具体的类型。

泛型的优点:
1. 类型安全:编译器可以在编译时检查类型错误,避免运行时类型转换异常。
2. 代码重用:可以编写通用的代码,适用于不同类型的数据。
3. 可读性和可维护性:泛型代码更易于理解和维护,因为类型信息可以在定义时指定。

其实泛型的出现,统一了集合中存储的元素,如果不使用泛型,当我们往集合中添加元素的时候,可以添加各种元素:数字,字符串等等,但是泛型规范了字符串中存储的类型。

使用泛型时的注意事项:

1.泛型不能写基本数据类型。(下面有解释)

2.指定泛型的基本类型之后,传递数据的时候,可以传入该类类型或者其子类类型

2.如果不写泛型,类型默认是object类(其实写了最后也是object类,下文有解释)

不使用泛型向集合中输入数据:

import java.util.ArrayList;
import java.util.Iterator;

public class test {
    public static void main(String[] args) {

        ArrayList list=new ArrayList();

        list.add(123);
        list.add("abc");
        list.add(1.2);

        //遍历集合中的每一个元素
        Iterator it = list.iterator();
        while(it.hasNext())
        {
            Object element =  it.next();
            System.out.println(element);
        }
    }
}

运行结果:

在不使用泛型的情况下,所有的数据都是Object类型的,此时可以向集合中添任意类型的数据,但是缺点就是我们无法调用这个类型的特有行为,如果要强制调用就要使用类型转换,而类型转化有可能会带来意想不到的错误。

利用泛型向集合中输入数据:

import java.util.ArrayList;
import java.util.Iterator;

public class test {
    public static void main(String[] args) {

        ArrayList<Integer> list=new ArrayList<>();

        list.add(113);
        list.add(125);
        list.add(133);

        //遍历集合中的每一个元素
        Iterator <Integer>it = list.iterator();
        while(it.hasNext())
        {
           int em=it.next();
            System.out.println(em);
        }
    }
}

运行结果:

 我们可以看到在使用了泛型之后,我们的输入元素就只能是指定类型,而且也不用object类型接收next的返回值,直接使用int类型的就可以了,这意味着我们可以直接调用这个类型的方法。

额外拓展:

但其实JAVA中的泛型是伪泛型。 

        Java泛型在编译时提供类型检查的功能,但在运行时会进行类型擦除,即泛型的类型信息被擦除为原始类型(raw type)。

        在Java中,泛型是在编译时执行类型检查的机制,通过使用泛型,可以在定义类、接口和方法时使用类型参数,并在使用时指定具体的类型。这样可以提高代码的类型安全性,并减少在运行时可能出现的类型错误。

        然而,在Java中的泛型机制实际上是通过类型擦除来实现的。在编译时,编译器会对泛型类型进行检查,确保类型的一致性。但在生成的字节码中,泛型的类型信息会被擦除掉,所有的泛型类型都被替换为其原始类型。

由于类型擦除的存在,导致了一些限制和特殊情况:
1. 无法使用基本类型作为类型参数,只能使用其对应的包装类。例如,不能使用基本类型int,而需要使用Integer。
2. 无法在运行时获取泛型的实际类型参数。例如,无法使用instanceof操作符或通过反射来确定泛型类型的实际参数化类型。
3. 在集合中无法存储具体的泛型类型,只能存储其原始类型。例如,无法创建一个ArrayList<int>,只能创建ArrayList<Integer>。

这种泛型类型擦除的机制被称为"伪泛型",因为在运行时无法获得泛型的类型信息。尽管如此,Java的泛型机制仍然提供了编译时的类型检查,减少了类型错误的发生,并提高了代码的可读性和可维护性。

总而言之,"Java中的泛型是伪泛型"意味着Java的泛型在编译时提供类型检查,但在运行时类型信息被擦除,只剩下原始类型。尽管存在一些限制和特殊情况,泛型仍然是一种有用的编程机制。

其实这些话概括起来就是:泛型虽然在向数组中输入数据的时候,规定了数据的类型,但是这些数据在转向字节码的时候,数据类型都会被抹去,还是变为object类型。我们把这种模式就叫做伪泛型。

总结:

        泛型是一个很实用的概念,它规范了数据的类型,便洁了我们的使用,因此我们要掌握好泛型这个概念,在后文我们也会对泛型的其他应用做详细的讲解。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

文章测试

Markdown示例 本文件的源码是一个markdown文件,也就是说在本工程中直接添加markdown即可嵌入到sphinx文档中。 关于使sphinx支持markdown的详细配置说明&#xff0c;请参考文档markdown-sphinx。 markdown的公式语法在sphinx可能不支持。 以下是markdown的语法使用示例 文…

PDF如何转换成Word?PDF转Word方法分享!​

PDF大家都不陌生了吧&#xff1f;作为打工人&#xff0c;学生党的大家都知道&#xff0c;PDF是现在不可或缺的文件传输工具之一&#xff0c;不仅可将文档转为Word&#xff0c;还可以转成excel,ppt等各种形式&#xff0c;其重要性不言而喻&#xff0c;那么今天小编就跟大家具体说…

Web自动化元素定位之xpath定位详解

Web自动化常见的定位方式 为什么要学习定位 1.让程序操作指定元素&#xff0c;就必须先找到此元素 2.程序不像人类用眼睛直接定位到元素 webDriver提供了八种定位元素的方式 定位方式总结 1.id、name、class_name、tag_name:根据元素的标签或元素的属性来进行定位 2.link_t…

gitLab配置ssh实现私钥访问

1.配置ssh文件 1.cd C:\Users\用户名\.ssh 找到文件夹 删除.ssh 里面所有其他文件方面我们配置要最新的 2.win r cmd 呼出命令行 ssh-keygen -t rsa -C "必须对应gitLab用户名" 3.生成文件夹拿到ssh 4.复制id_rsa_pub 文件的全部字符串 公钥给到GitLab服务器 2.公…

使用 JavaScript 在没有插件的情况下输入文本掩码

文章目录 JavaScript 中信用卡号的输入掩码JavaScript 中的邮政编码输入掩码在 JavaScript 中使用括号输入掩码的电话号码为 JavaScript 中的不同字段自定义输入掩码 JavaScript 输入掩码或掩码文本框是一种控件&#xff0c;它为用户提供了一种简单可靠的方式来收集基于标准掩码…

【Servlet学习三】实现一个内存版本的简易计算器~

目录 一、方式1&#xff1a;使用form表单的形式&#xff08;不推荐&#xff09; &#x1f308;1、前端代码&#xff1a;HTML文件 &#x1f308;2、后端代码&#xff1a;Calculator_form.java文件 &#x1f308;3、最终效果 二、方式2&#xff1a;使用ajax形式&#xff08;…

力扣 105. 从前序与中序遍历序列构造二叉树

题目来源&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/ C题解&#xff1a;前序遍历是中左右&#xff0c;中序遍历是左中右&#xff0c;所以拿到两个遍历数组&#xff0c;我们可以从前序遍历首节点获取中间…

Docker 私有仓库

一、私有仓库搭建 拉取私有仓库镜像 docker pull registry 启动私有仓库 docker run -id --nameprivate_registry -p 5000:5000 registry 打开浏览器输入 http://私有仓库服务器IP地址:5000/v2/_catalog 修改 daemon.json 文件 sudo gedit /etc/docker/daemon.json 在…

在Mapper.xml中写复杂的动态SQL语句

说明&#xff1a;在三层架构开发中&#xff0c;使用Mybatis框架操作数据库有两种方式&#xff0c;一种是在Mapper类里的方法上加注解&#xff08;Select、Insert等&#xff09;&#xff0c;另一种是在Mapper.xml文件的标签内写SQL语句。第二种方式相比第一种&#xff0c;具有更…

electron webview 页面加载事件顺序

electron webview 页面加载事件顺序 1.did-start-loading 页面开始加载web 2.load-commit 主页面文档加载框架 3.page-title-updated titledom 4.dom-ready 主页面 dom 加载完成electron 5.load-commit frame文档加载.net 6.did-frame-finish-load frame 加载完成cdn 7.d…

Springboot钉钉免密登录集成(钉钉小程序和H5微应用)

欢迎访问我的个人博客:www.ifueen.com RT&#xff0c;因为业务需要把我们系统集成到钉钉里面一个小程序和一个H5应用&#xff0c;并且在钉钉平台上面实现无感登录&#xff0c;用户打开我们系统后不需要再输入密码即可登录进系统&#xff0c;查阅文档实际操作过之后记录一下过程…

HTML转EXE工具(HTML App Build)永久免费版

HTML转EXE工具&#xff08;HTM2EXE&#xff09;在CSDN上发布时间轴&#xff1a; 序号时间链接12022-08-17HTML转EXE工具&#xff08;HTML App Build&#xff09;初始版22023-02-18HTML转EXE工具&#xff08;HTML App Build&#xff09;最新版32023-06-23&#xff08;实际未发布…

高德地图点聚合报错

最近做项目遇到这样一个玄学问题&#xff1a; 在写高德地图的时候加一个覆盖物 除了金华市其他城市覆盖并且不能点击&#xff0c;金华市内点击获取坐标点这样一个业务&#xff0c; 到这里都很正常&#xff0c;代码奉上 const AMap window.AMapconst state reactive({mapInp…

黑客进行网络欺骗攻击的手段有哪些?

网络欺骗主要方式有&#xff1a;IP 欺骗、ARP 欺骗、DNS 欺骗、Web 欺骗、电子邮件欺骗、源路由欺骗和地址欺骗等。其技术主要分为 HONEYPOT、分布式 HONEYPOT 和欺骗空间技术等。其中&#xff0c;源路由欺骗方式指通过指定路由&#xff0c;以假冒身份与其他主机进行合法通信或…

python实现遗传算法(单目标优化,多目标优化)

首先我们应该熟悉numpy的矩阵取值 [:, 1::2] # 第一维&#xff0c;从第二个元素起步长为2取元素[:, ::2] # 第一维&#xff0c;从第一个元素起步长为2取元素 1 遗传本质 染色体的交叉和变异 种群&#xff1a;很多个个体组成的群体&#xff0c;即为所有可能解的集合个体&…

[muduo学习笔记]事件分发器(Channel、Poller)

此学习笔记参考施磊老师的muduo教学课程。 目的是搞懂 muduo 网络库的核心框架。EventLoop、channel 和 Poller 之间的关系 文章目录 1 Poller 抽象基类2 Channel3 模块的包含muduo模块梳理参考&#xff1a; 整体框架如下&#xff1a; muduo是基于 Reactor 模式的网络库&#…

vue中v-for重复数据处理||element下拉框去除重复

前端去重方法有多种,只说三种常用的(新老方法都有) 1-使用常规双for循环(暴力算法)遍历比较的方式对值进行比较 2-使用js方法sort排序&#xff08;只针对数组&#xff09;&#xff0c;但是经常在vue等新框架中提示TypeError: arr.sort is not a function 3-使用reduce方法(>…

传统后端漏洞----(Web Server) 解析漏洞

笔记 前言IIS解析漏洞文件夹解析漏洞原理限制条件 ";" 分号截断漏洞原理 IIS解析漏洞检测IIS 文件夹解析漏洞检测IIS 分号截断漏洞检测 防御手段 Nginx解析漏洞Nginx 文件类型错误解析漏洞导致任意PHP代码执行原理Nginx 空字节解析漏洞导致任意文件可解析&#xff08…

DB2:DB2TOP解析

文章目录 简介主界面功能介绍快捷设置数据库监控(d)表空间监控(Tablespace)&#xff08;t&#xff09;动态SQL监控(Dynamic SQL)(D)表监控&#xff08;T&#xff09;会话监控(session)(l)缓冲池监控(Bufferpool)(b)锁监控(Locks)(U)瓶颈监控(Bottleneck)(B)load监控(Utilities)…

FastDFS单机部署及SpringBoot整合

前言 FastDFS是一个开源的高性能分布式文件系统。它的主要功能包括&#xff1a;文件存储、文件同步和文件访问&#xff08;文件上传和文件下载&#xff09;&#xff0c;可以解决高容量和负载平衡问题。FastDFS应满足其服务基于文件的网站的要求&#xff0c;如照片共享网站和视…