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

news/2025/2/4 6:58:02/

目录

前言:

泛型:

额外拓展:

总结:


前言:

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

相关文章

单片机与触摸屏通信c语言,讲述如何实现单片机与触摸屏的通信

随着触摸屏的应用和产量的增加,价格下降。因而有可能使用触摸屏作为单片机控制设备的键盘和显示装置,提高单片机控制设备的档次。触摸屏与PLC联合使用时,触摸屏的主要功能是: ①显示PLC输入,输出端13或辅助继电器的开关状态。 ②用触摸按键强制PLC输入,输出端口或辅助继电…

typec扩展坞hdmi没反应_Type-C转HDMI+USB+PD转接头手机连接电视图文教程疑难解答

本文为Type-C转HDMI+USB+PD扩展坞连接教程,手机投屏电视模式和电脑模式的图文说明,适用于Type-C接口支持视频功能的手机,如华为P30、华为P30 Pro、华为Mate20、华为Mate20 Pro、Mate10/Mate10 pro、华为P20、三星S8/S8+/S9/S9+、三星Note8、小米Air、联想小新 Air 13 i5 201…

ios手机 按钮点击事件没反应(按钮是js生成的)

昨天碰到这种问题&#xff0c;在Android手机上点击事件是可以的&#xff0c;但是iOS手机没反应。用的是jQuery&#xff0c;我立即就想到是点击事件格式写的有问题&#xff0c;因为 我之前就碰到过类似的问题&#xff0c;比如&#xff0c;你用js 生成的一个按钮 <div class&…

有关像素流送手机浏览器触屏bug的总结

Bug描述&#xff1a; 使用手机浏览器操作UE4像素流送程序时&#xff0c;程序只能正常处理一个按键。 当有两个或两个以上按键同时按下时&#xff0c;有一定几率导致程序始终有一个按键没有释放&#xff0c;致使程序再也无法处理用户的正常输入&#xff08;多指触摸后有一个按键…

android 屏幕点击没反应,华为手机触摸屏没反应怎么办?解决手机触摸屏时灵时不灵的办法...

华为手机(Mate7,荣耀6 Plus,荣耀6,P7)有时候触摸没反应&#xff0c;等一下又突然好了&#xff0c;或者屏幕的某些位置点击了没有反应&#xff0c;该怎么办&#xff1f; 1、先确认是否是后台开启的软件太多了或者开启了非常耗内存的游戏和应用&#xff0c;导致机器反应慢&#x…

微信月活破10亿,安全性靠谁来支撑?

&#x1f449;腾小云导读 微信作为月活过10亿的国民级应用&#xff0c;其安全能力备受关注。值得注意的是&#xff0c;没有足够的特征数据&#xff0c;安全策略将是"无根之木&#xff0c;无源之水"。微信安全数据仓库作为安全业务的特征数据存储中心&#xff0c;每天…

第二章 数据结构(二、三)——Trie树,并查集,堆与哈希表

文章目录 Trie树并查集堆哈希表拉链法开放寻址法字符串前缀哈希 Trie树练习题835. Trie字符串统计143. 最大异或对 并查集练习题836. 合并集合837. 连通块中点的数量240. 食物链 堆练习题838. 堆排序839. 模拟堆 哈希练习题840. 模拟散列表841. 字符串哈希 Trie树 用来高效的存…

Java Web从入门到实战

??个人博客&#xff1a;www.hellocode.top?? 所有文章均在上方博客首发&#xff0c;其他平台同步更新 ??本文专栏&#xff1a;《Java Web从入门到实战》 ??> 如没有Java基础&#xff0c;请先前往《Java零基础指南》专栏学习相应知识 如有问题&#xff0c;欢迎指正&a…