• Java 容器 & 泛型:六、容器讲到为什么要使用泛型


    Writer:BYSocket(泥沙砖瓦浆木匠)

    微博:BYSocket

    豆瓣:BYSocket

        ArrayList是集合类中无处不在的,泛型也是,泛型对集合类尤其有用。但是为啥要使用泛型?理解好了这个问题可以帮助理解相关的更多知识点。下面泥瓦匠以最简单的例子来验证这个问题。

    一、泛型

        泛型的目的是为了可以让更多不同类型的对象重用。没错,这样理解就太low。真正目的是为了在编译时找到bug,而不是在运行时。(编译时,指的是源代码翻译成机器识别的代码的时候。运行时,是指代码在机器中运行的时候。)泛型只存在编译时,理解这个可以帮助你更好的理解泛型。

        这样,在编译时会比在运行时更容易地找到bug和修复。

    二、实现没有泛型的简易版ArrayList

        简易版的ArrList有个Obejct对象(因为是Object,我们可以add任意类型。)比如说,Integer 和 String的。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package javaBasic.generic;
     
    /**
     * 简易版ArrayList
     */
    class ArrList
    {
        private Object obj;
     
        public Object getObj()
        {
            return obj;
        }
     
        public void add(Object obj)
        {
            this.obj = obj;
        }
         
    }
     
    public class TestArrayList
    {
        public static void main(String[] args)
        {
            ArrList arrList = new ArrList();
            arrList.add(1);
            arrList.add("1");
             
            Integer objInt = (Integer) arrList.getObj();
            System.out.println(objInt);
        }
    }

    运行可以看出会出现ClassCastException:

    1
    2
    Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
        at javaBasic.generic.TestArrayList.main(TestArrayList.java:30)

    想问的问题是:”这Object对象属性,怎么不能强转呢?“

    :编译时,代码没错的。运行main时,当set了String类型时,将结果强制转换为Integer就会报错这个错了。

    泥瓦匠的记忆宫殿又来了:

    1、使用泛型比那些杂乱的需要强制转换的Object代码具有更好的安全性和可读性。

    2、使用泛型可以在编译时轻松找到和解决bugs

    三、使用改写简易版ArrayList

        使用泛型代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    package javaBasic.generic;
     
    /**
     * 简易版ArrayList
     */
    class ArrList<T>
    {
        private T obj;
     
        public T getObj()
        {
            return obj;
        }
     
        public void add(T obj)
        {
            this.obj = obj;
        }
         
    }
     
    public class TestArrayList
    {
        public static void main(String[] args)
        {
            ArrList<Integer> arrList = new ArrList<>();
            arrList.add(1);
    //      arrList.add("1");
             
            Integer objInt = arrList.getObj();
            System.out.println(objInt);
        }
    }

    这时候如果想用

    1
    arrList.add("1");

    会发现:

    image

    这时候就是泛型大显身手的时候,也不用需要对属性 get 方法时的强制转换。其实,  Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。这里T就相当于Integer。

    四、小结

    泥瓦匠记忆宫殿

    1、在编译时检查强类型

    2、显示转换的消除(上面的Integer get省去)

    3、更好地实现代码重用和泛型算法

    4、使用泛型比那些杂乱的需要强制转换的Object代码具有更好的安全性和可读性。

       Java 泛型只是编译时的概念,因为编译后类型会被擦除,还原本真。哈哈~下次说这个。

    Writer:BYSocket(泥沙砖瓦浆木匠)

    微博:BYSocket

    豆瓣:BYSocket

  • 相关阅读:
    POJ C程序设计进阶 编程题#4:Tomorrow never knows?
    POJ C程序设计进阶 编程题#3: 发票统计
    深度学习笔记(10)- 控制中心之电源管理、鼠标和触控板、键盘和语言
    深度学习笔记(09)- 控制中心之时间设置
    深度学习笔记(08)- 控制中心之网络设置
    深度学习笔记(07)- 控制中心之声音设置
    深度学习笔记(06)- 控制中心之个性化设置
    深度学习笔记(05)- 控制中心之显示与默认程序
    深度学习笔记(04)- 控制中心之首页与用户管理
    深度学习笔记(03)- 启动器
  • 原文地址:https://www.cnblogs.com/Alandre/p/4486203.html
Copyright © 2020-2023  润新知