[从零开始学习JAVA ] 泛型

news/2025/3/20 2:52:16/

前言:

本文将详细介绍之前我们在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.ppmy.cn/news/1580484.html

相关文章

微软开源神器OmniParser V2.0 介绍

微软开源的OmniParser V2.0是一款基于纯视觉技术的GUI智能体解析工具&#xff0c;旨在将用户界面&#xff08;UI&#xff09;截图转换为结构化数据&#xff0c;从而实现对计算机屏幕上的可交互元素的高效识别和操控。这一工具通过结合先进的视觉解析技术和大型语言模型&#xf…

vue-router实现

实现一个简化版的 vue-router 可以帮助我们更好地理解 Vue 路由是如何工作的。Vue Router 主要的功能是基于浏览器的 URL 来管理组件的显示&#xff0c;能够根据 URL 变化切换不同的视图。下面是一个简化版的实现&#xff0c;用于帮助你理解基本的路由机制。 创建一个简单的 V…

Api架构设计--- HTTP + RESTful

Api架构设计--- HTTP RESTful 什么是RESTfulRESTful 设计原则RESTful 接口类型RESTful 状态码RESTful Uri设计原则Api传参&#xff1a;QueryString 和 UriPath RESTful和HTTP的区别注意事项 什么是RESTful RESTful&#xff08;Representational State Transfer&#xff09;是一…

Git使用和原理(3)

1.远程操作 1.1分布式版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者 计算机上。⽽我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&a…

STM32——GPIO介绍

GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…

WordPress the_category与single_cat_title的区别

在wordpress网站主题开发用常会用到调用分类目录的名称&#xff0c;the_category与single_cat_title都可以调用出分类目录的名称。 <?php single_cat_title(); ?> <?php the_category(); ?>但是&#xff0c;不少人搞不清楚二者有什么区别&#xff0c;其实很简…

Python使用总结之Flask构建文件服务器,通过网络地址访问本地文件

Python使用总结之Flask构建文件服务器,通过网络地址访问本地文件 在 Web 开发中,静态文件(如图片、CSS、JavaScript)的管理是基础且重要的环节。Flask 提供的 send_from_directory 函数为开发者提供了灵活的文件服务解决方案。本文将详细解析其原理、用法及最佳实践。 一…

Python接口自动化浅析unittest单元测试原理

这篇文章主要介绍了Python接口自动化浅析unittest单元测试原理,文中描述了单元测试&#xff0c;unittest模块特性、大致流程、源码及实战例子这几个模块&#xff0c;有需要的朋友可以借鉴参考下 以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是…