泛型

  • Post author:
  • Post category:其他




JDK5.0泛型

集合可以存储任何类型的对象,但是当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就变成了Object类型。换句话说,在程序中无法确定一个集合中的元素到底是什么类型的。那么在取出元素时,如果进行强制类型转化就很容易出错。


【案例1】


在这里插入图片描述

运行结果:

String

Collection


Exception in thread “main” java.lang.ClassCastException: java.base/java.lang.Integer cannot be cast to java.base/java.lang.String at com.jinglan.exercise.Demo0.main(Demo0.java:12)

上面的例子中向List集合存入了3个元素,分别是两个字符串和一个整数。在取出这些元素时,都将它们强转为String类型,由于Integer对象无法转换为String类型,因此在程序运行时会出现**Exception in thread “main” java.lang.ClassCastException: java.base/java.lang.Integer cannot be cast to java.base/java.lang.String at com.jinglan.exercise.Demo0.main(Demo0.java:12)**的错误。为了解决这个问题,在Java中引入了“参数化类型(parameterized type)”这个概念,即泛型。它可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下:

ArrayList<参数化类型> list = new ArrayList<参数化类型>();

下面【案例1】进行修改:


【案例2】


在这里插入图片描述

这种写法就限定了ArrayList集合只能存储String类型元素,将改写后的程序在Eclipse中编译时就会出现错误提示。

程序编译报错的原因是修改后的代码限定了集合元素的数据类型,ArrayList这样的集合只能存储String类型的元素,程序在编译的时候,编译器检查出Integer类型的元素与List集合的规定类型不匹配,编译不通过。这样就可以在编译时解决错误,避免程序在运行时发生错误。

下面再更改【案例2】

在这里插入图片描述

运行结果:

在这里插入图片描述

【案例3】中使用泛型规定了ArrayList集合只能存入String类型元素,然后向集合中存入了两个String类型元素,并对这个集合进行遍历,从运行结果可以看出,该程序已经可以正常运行。需要注意的是,在使用泛型后,每次遍历集合元素时,可以指定元素类型为String,而不是Object,这样就避免了在程序中进行强制类型转换。



版权声明:本文为muyuxifeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。