茫茫人海千千万万,感谢这一秒你看到这里。希望我的文章对你的有所帮助!

愿你在未来的日子,保持热爱,奔赴山海!

题记:接下来我们讲解一下泛型,为什么需要使用泛型,对于泛型的定义以及使用是什么呢? 所以,今天我们将展开对泛型的深入了解。

😛 我们为什么需要使用泛型

早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

  • 来看一个经典案例:

    public static void main(String[] args) {
            //测试一下泛型的经典案例
            ArrayList arrayList = new ArrayList();
            arrayList.add("helloWorld");
            arrayList.add("taiziyenezha");
            arrayList.add(88);//由于集合没有做任何限定,任何类型都可以给其中存放
    
            for (int i = 0; i < arrayList.size(); i++) {
                //需求:打印每个字符串的长度,就要把对象转成String类型
                String str = (String) arrayList.get(i);
                System.out.println(str.length());
            }
        }
    

    运行这段代码,程序在运行时发生了异常:

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    

    发生了数据类型转换异常,这是为什么?

    由于ArrayList可以存放任意类型的元素。例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,导致取出时强制转换为String类型后,引发了ClassCastException,因此程序崩溃了。

    这显然不是我们所期望的,如果程序有潜在的错误,我们更期望在编译时被告知错误,而不是在运行时报异常。而为了解决类似这样的问题(在编译阶段就可以解决),在jdk1.5后,泛型应运而生。让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。

我们将第一行声明初始化ArrayList的代码更改一下,编译器就会在编译阶段就能够帮我们发现类似这样的问题。现在再看看效果。

ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("helloWorld");
arrayList.add("taiziyenezha");
arrayList.add(88);// 在编译阶段,编译器就会报错

这样可以避免了我们类型强转时出现异常。

😜什么是泛型

  • 泛型:是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,而这种参数类型可以用在类、方法和接口中,分别被称为<font color=#ff1493>泛型类</font>、<font color=#ff1493>泛型方法</font>、<font color=#ff1493>泛型接口</font>。

    注意:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

而在Java中实现泛型机制的主要目的是为了可以把发现异常bug的时机提前到编程源码时,而不是运行时才发生异常bug。如果我们能够在编译时期就可以发现异常bug,就可以为我们程序员节省大量的调试Java程序的时间。

因而编译错误可以比较容易和比较快速地被发现和修复。而且,泛型仅仅只存在于编译时,这个事实也是我们学习Java泛型的过程中必须记住的最重要的一个事实。

😝使用泛型的好处

像我们昨天举的经典例子来说,没有泛型,集合最后会变成什么样子,

  • 集合由于对元素的类型是没有任何限制的操作。本来我的ArrayList集合装载的是全部的String字符串,但是我们又把Integer整型数字给存储到集合中,是没有任何语法错误的。
  • 把任意对象扔进集合中,集合是根本不知道元素的类型是什么的,仅仅知道是Object。因此在get()的时候,返回的是Object。而我们要获取该对象,还需要强制转换

有了泛型以后:

  • 代码更加简洁不用强制转换
  • 程序更加健壮只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常
  • 可读性和稳定性在编写集合的时候,就限定了类型

所以好处有:

  • 避免了类型强转的麻烦。
  • 它提供了编译期的类型安全,确保在泛型类型(通常为泛型集合)上只能使用正确类型的对象,避免了在运行时出现ClassCastException。

🌸总结

相信各位看官都对泛型有了更加深入的了解,知道了泛型的概念定义,以及使用的好处,那我们继续期待下一章的泛型的使用吧!欢迎期待下一章的到来!

让我们也一起加油吧!本人不才,如有什么缺漏、错误的地方,也欢迎各位人才大佬评论中批评指正!当然如果这篇文章确定对你有点小小帮助的话,也请亲切可爱的人才大佬们给个点赞、收藏下吧,一键三连,非常感谢!

学到这里,今天的世界打烊了,晚安!虽然这篇文章完结了,但是我还在,永不完结。我会努力保持写文章。来日方长,何惧车遥马慢!

感谢各位看到这里!愿你韶华不负,青春无悔!