zoukankan      html  css  js  c++  java
  • 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类存在两个问题:

    1. 每获取一个值都必须进行强制类型转换。
    ArrayList files = new ArrayList();
    ...
    String fileName = (String) files.get(0);
    
    1. 由于没有错误检查,可以插入任意类型的对象。
    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方法的使用进行检查,避免调用者传入错误类型的参数。

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

  • 相关阅读:
    0x00 mysql 的安装,简单mysql命令的使用
    nuxt中定制iview主题颜色
    获取浏览器语言的解决方案
    nuxt页面切换效果
    MySQL(非sql sever)安全体系的学习心得
    My SQL日志 学习心得
    楼梯在SQL Server事务日志管理,三级:事务日志,备份和恢复(16周翻译)
    SQL Server事务日志管理的阶段,1级:事务日志概述
    楼梯在SQL Server事务日志管理,一级:事务日志的概述(15周翻译)
    数据库的独立子查询以及数据的删除、更新和建立视图的笔记
  • 原文地址:https://www.cnblogs.com/XiaoZhengYu/p/12632319.html
Copyright © 2011-2022 走看看