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

    1. import java.util.ArrayList;
    2. public class example16 {
    3. public static void main(String[] args) {
    4. ArrayList list = new ArrayList();
    5. list.add("string");
    6. list.add("Collectoin");
    7. list.add(1);
    8. for (Object object : list) {
    9. String string = (String) object;
    10. }
    11. }
    12. }
    13. console:
    14. Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    15. at example16.example16.main(example16.java:12)

    在上述代码块中,向 List 集合存入了 3 个元素,分别时两个字符串和一个整数。在取出这些元素时,都将它们强转为 String 类型,由于 Integer 对象无法转换为 String 类型,因此在程序运行时会出现编译错误。为了解决这个问题,在 Java 中引入了“参数化类型(parameterized type)”这个概念,即泛型。它可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下。

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

    1、
    接下来,对上述代码块的第 5 行代码进行修改,如下

    1. ArrayList<String> list = new ArrayList<String>(); //创建集合对象并指定泛型为 String

    上面这种写法就限定了 ArrayList 集合只能存储 String 类型元素,将改写后的程序在 Ecplise 中编译时就会出现错误提示,如下所示
    QQ截图20200605143325.png
    在上图中,程序编译报错的原因时修改后的代码限定了集合元素的数据类型,ArrayList这样的集合只能存储 String 类型的元素,程序在编译时,编译器检查出 Integer 类型的元素与 List 集合的规定类型不匹配,编译不通过。这样就可以在编译时解决错误,避免程序在运行时发生错误。

    2、
    接下来使用泛型再次对代码块进行改写,如下

    1. import java.util.ArrayList;
    2. public class example16 {
    3. public static void main(String[] args) {
    4. ArrayList<String> list = new ArrayList<String>();
    5. list.add("string");
    6. list.add("Collectoin");
    7. for (Object object : list) {
    8. String string = (String) object;
    9. System.out.println(string);
    10. }
    11. }
    12. }
    13. console:
    14. string
    15. Collectoin

    使用泛型规定了 ArrayList 集合只能存入 String 类型元素,然后向集合中存入了两个 String 类型元素,并对这个集合进行遍历。需要注意的是,在使用泛型后,每次遍历集合元素时,可以指定元素类型为 String,而不是 Object。这样就避免了在程序中进行强制类型转换。