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


猜你喜欢
- 一、项目目录即一个空项目里,有两个springboot的Module。当需要修改kuangshen-es-api这个Module的jdk版本
- 整理文档,搜刮出一个java实现向有序数组中插入一个元素,稍微整理精简一下做下分享package cn.jbit.array; import
- 作为代码质量检查的流行工具,比如Sonarqube能够检查代码的“ * ”,跟代码结合起来能够更好地提高代码的质量,这篇文章将会介绍如何结合
- 单行文本的输入存在严重的缺陷,也不适合实际的运用,本节通过一个无功能的记事本来介绍可以进行多行输入的JTextArea:JTextArea(
- 一,问题采取eureka集群、客户端通过Ribbon调用服务,Ribbon端报下列异常java.net.UnknownHostExcepti
- 目录三大只读类型介绍使用 IReadOnlyList 替换 List使用 IEnumberable 接口集合 表示一组可用于获取和存储的对象
- 前言 CompoundButton在XML文件中主要使用下面两个属性。checked:指定按钮的勾选状态,true表示勾选,fal
- 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能
- 调用后动态壁纸其实是显示在Activity的后面,而Activity则是透明显示,这样就可以看到下面的动态壁纸,如果Activity不是透明
- 在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢?帧动画:不是针对View做出一些形状上的变化,而是用于播放一张张的图片
- 前言在一个名为种花家的小镇上,生活着一群热爱编程的人。他们致力于构建出高效、可维护的软件系统,而 Spring Boot 框架成为了他们的不
- 前言上一节我们搭建起了服务注册中心,为各个服务提供者和消费者提供一个桥梁,这一节我们搭建一个服务提供者,注册到注册中心开源地址:https:
- 1. 单个属性yaml 内的属性如下:server: port: 80只需在成员变量上注解 @Value(“
- 本文实例为大家分享了Android TextView实现跑马灯效果的具体代码,供大家参考,具体内容如下当Layout中只有一个TextVie
- 本文实例为大家分享了RecyclerView实现水平列表的具体代码,供大家参考,具体内容如下1、效果图2、activity_horizont
- package TestList;import java.util.ArrayList;import java.util.Iterator;
- Javaweb开发环境的配置也是比较繁琐的一件事情,虽然理论上使用记事本,完全可以写出一个Javaweb工程,但是在团队大型开发的Javaw
- 当我们要创建一个Tcp/Ip Server connection ,我们需要一个范围在1000到65535之间的端口 。但是本机一个端口只能
- StringBuilder与StringBuffer是两个常用的操作字符串的类。大家都知道,StringBuilder是线程不安全的,而St
- 本文实例为大家分享了C语言实现学生成绩管理系统的具体代码,供大家参考,具体内容如下结构体版的学生成绩管理系统主要功能有按1 输入学生信息按2