Java泛型机制必要性及原理解析
作者:Hello_xzy_World 发布时间:2022-09-30 02:21:41
泛型程序设计(Generic Programming)
“使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类尤其有用。”
1.意义、必要性、重要性
泛型程序设计 意味着编写的代码可以被很多不同类型的对象所重用。例如,我们并不希望为聚集String和File对象分别设计不同的类。实际上,也不需要这样做,因为一个ArrayList类就可以聚集任何类型的对象。这是一个泛型程序设计的实例。
事实上,在Java增加泛型机制前就存在一个ArrayList类。下面借助ArrayList类的演变来说明Java引入泛型机制到底有重要。
在Java引入泛型类之前,ArrayList类将维护一个Object引用的数组:
public class ArrayList{
private Object[] elementData;
...
public Object get(int i){...}
public void add(Object o){...}
}
使用这种ArrayList类存在两个问题:
每获取一个值都必须进行强制类型转换。
ArrayList files = new ArrayList();
...
String fileName = (String) files.get(0);
由于没有错误检查,可以插入任意类型的对象。
files.add(new File("..."));
对于上面的操作,编译和运行的时候都不会出错。然而,当其他地方取出该数据,并试图进行强制类型转换时就会产生一个错误。
ArrayList files = new ArrayList();
//不报错
files.add(new File("..."));
//报错
String fileName = (String) files.get(0);
对于上面提到的两个问题,泛型提供了一个很好的解决方案:类型参数(type parameters)。在ArrayList类中使用一个类型参数来指示元素的类型:
public class ArrayList<E>{
private Object[] elementData;
...
public E get(int i){...}
public void add(E o){...}
}
ArrayList<String> files = new ArrayList<>();
这使得代码具有更好的可读性,人们一看就能知道这个数组列表中包含的是String对象。
同时,编译器也可以很好的利用这个信息。当调用get方法时,因为编译器已经知道返回值是String类型,所以不在需要进行强制类型转换。当调用add方法时,编译器因为知道add方法的参数是String类型,可以对add方法的使用进行检查,避免调用者传入错误类型的参数。
在编译时就发现错误比运行时才发现错误要好得多*,类型参数的魅力在于:使得程序具有更好的可读性和安全性。
来源:https://www.cnblogs.com/KenBaiCaiDeMiao/p/12632319.html
猜你喜欢
- 前言Java中URL传中文时乱码的问题相信不少朋友都遇到过,最近就遇到一个问题,就是在Action当中把一条中文信息绑定在URL的后面,Ac
- 一、业务需求实现省份与城市的二级联动二、实现效果三、代码实现1. province_city.jsp前端界面实现<%@ p
- 找了很久查询objectid的方法都是错的,用mongovue能查询出来,但就是用java不知道怎么查询1.mongovue里的查询方式:{
- 1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都
- 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下:public partial class Form2 : Form
- mybatis count()按条件查询1、sql count()函数count()函数返回匹配指定条件的行数。sql count(colu
- 本文实例讲述了Java实现的微信图片处理工具类。分享给大家供大家参考,具体如下:现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相
- 前言最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录。供大家学习参考。Synchronized修饰非静态方法Syn
- 一、使用@CrossOrigin注解在controller类上加上@CrossOrigin注解,就能对这个类下面所有方法进行跨域访问了@Cr
- 功能:解决web站点的登录,权限验证,授权等功能优点:在不影响站点业务代码,可以权限的授权与验证横切到业务中1、要添加的依赖<!--t
- Android自带的跑马灯效果不太好控制,还必须要满足条件才能有效果,而且速度不受控制。前面我的博客中有一篇就是用Android自带的跑马灯
- 首先创建一个用户控件 如下图 用到的控件 label、button、TextBox 内部代码如下#region 分页字段和属性pr
- jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过
- 前言在前面的2个章节中,一一哥 带大家实现了在Spring Security中添加图形验证码校验功能,其实Spring Security的功
- 介绍记录将elasticsearch集成到spring boot的过程,以及一些简单的应用和helper类使用。接入方式使用spring-b
- string fileExt = Path.GetExtension(excelPath);string conn = "&quo
- 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言这两天在项目中使用到Java的导入导出功能,以前对这块有一定了解,但是没
- Feign传递请求头信息在我之前的文章服务网关Spring Cloud Zuul中,将用户的登录id放在了请求头中传递给内部服务。但是当内部
- Java5 在 java.util.concurrent 包中已经包含了读写锁。尽管如此,我们还是应该了解其实现背后的原理。读/写锁的 Ja
- 人机猜拳小游戏,只要用到的java面向对象的思维模式。本游戏中有游戏玩家和计算机两个参与者。玩家和计算机都有的属性是姓名和得分。共分为4个类