Java泛型机制必要性及原理解析

 更新时间:2020年05月01日 11:14:19   作者:Hello_xzy_World  
这篇文章主要介绍了Java泛型机制必要性及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

泛型程序设计(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方法的使用进行检查,避免调用者传入错误类型的参数。

在编译时就发现错误比运行时才发现错误要好得多*,类型参数的魅力在于:使得程序具有更好的可读性和安全性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JVM内置函数Intrinsics介绍

    JVM内置函数Intrinsics介绍

    这篇文章主要介绍了JVM内置函数Intrinsics,我们将学习什么是intrinsics(内部/内置函数),以及它们如何在Java和其他基于JVM的语言中工作,需要的朋友可以参考一下
    2022-02-02
  • SpringBoot实现向量数据库优化检索的方案及示例

    SpringBoot实现向量数据库优化检索的方案及示例

    在Spring Boot中实现RAG(Retrieval-Augmented Generation)的增强,可以从检索优化、生成优化和系统架构三个维度进行改进,本文给大家介绍了具体实现方案及示例,需要的朋友可以参考下
    2025-02-02
  • java中的Io(input与output)操作总结(四)

    java中的Io(input与output)操作总结(四)

    前面已经把java io的主要操作讲完了,这一节我们来说说关于java io的其他内容:Serializable序列化/DataOutputStream和DataInputStream类/管道流等等,感兴趣的朋友可以了解下
    2013-01-01
  • 通过Session案例分析一次性验证码登录

    通过Session案例分析一次性验证码登录

    这篇文章主要介绍了通过Session案例分析一次性验证码登录,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Java虚拟机之类加载

    Java虚拟机之类加载

    这篇文章主要介绍了Java虚拟机之类加载,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Java高级用法中的JNA类型映射注意细节及使用问题

    Java高级用法中的JNA类型映射注意细节及使用问题

    本文介绍了在使用JNA方法映射中应该注意的一些细节和具体的使用问题,对java  JNA类型映射注意细节感兴趣的朋友一起看看吧
    2022-04-04
  • 使用mybatis-plus分页出现两个Limit的问题解决

    使用mybatis-plus分页出现两个Limit的问题解决

    在使用MyBatis-Plus进行分页查询时,可能会遇到查询SQL中出现两个limit语句的问题,这通常是由于在多个模块中重复引入了MyBatis-Plus的分页插件所导致的,下面就来介绍一下如何解决,感兴趣的可以了解一下
    2024-10-10
  • Java读取properties配置文件的8种方式汇总

    Java读取properties配置文件的8种方式汇总

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,下面这篇文章主要给大家介绍了关于Java读取properties配置文件的8种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Nacos1.4.0 Windows10单机模式启动和集群启动过程解析

    Nacos1.4.0 Windows10单机模式启动和集群启动过程解析

    这篇文章主要介绍了Nacos1.4.0 Windows10单机模式启动和集群启动,第一次使用nacos,废话不多说,记录下自己启动Nacos遇到的坑,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Spring应用中使用acutator/refresh刷新属性不生效的问题分析及解决

    Spring应用中使用acutator/refresh刷新属性不生效的问题分析及解决

    在Spring应用收到/actuator/refresh的POST请求后,标注了@RefreshScope以及@ConfiguratioinProperties的bean会被Spring容器重新加载,但是,在实际应用中,并没有按照预期被Spring容器加载,本文将讨论导致这种未按预期刷新的一种原因,感兴趣的朋友可以参考下
    2024-01-01

最新评论