0、
集合可以存储任何类型的对象, 当时当把一个对象存入集合后,集合会“忘记”这个对象的类型,将该对象从集合中取出时,这个对象的编译类型就变成了 Object 类型。换句话说,在程序中无法确定一个集合中的元素到底是什么类型的。那么在取出元素时,如果进行强制类型转换就很容易出错。下面通过一个案例来演示这种情况。
import java.util.ArrayList;
public class example16 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("string");
list.add("Collectoin");
list.add(1);
for (Object object : list) {
String string = (String) object;
}
}
}
console:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at example16.example16.main(example16.java:12)
在上述代码块中,向 List 集合存入了 3 个元素,分别时两个字符串和一个整数。在取出这些元素时,都将它们强转为 String 类型,由于 Integer 对象无法转换为 String 类型,因此在程序运行时会出现编译错误。为了解决这个问题,在 Java 中引入了“参数化类型(parameterized type)”这个概念,即泛型。它可以限定方法操作的数据类型,在定义集合类时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下。
ArrayList<参数化类型> list = new ArrayList<参数化类型>();
1、
接下来,对上述代码块的第 5 行代码进行修改,如下
ArrayList<String> list = new ArrayList<String>(); //创建集合对象并指定泛型为 String
上面这种写法就限定了 ArrayList 集合只能存储 String 类型元素,将改写后的程序在 Ecplise 中编译时就会出现错误提示,如下所示
在上图中,程序编译报错的原因时修改后的代码限定了集合元素的数据类型,ArrayList
2、
接下来使用泛型再次对代码块进行改写,如下
import java.util.ArrayList;
public class example16 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("string");
list.add("Collectoin");
for (Object object : list) {
String string = (String) object;
System.out.println(string);
}
}
}
console:
string
Collectoin
使用泛型规定了 ArrayList 集合只能存入 String 类型元素,然后向集合中存入了两个 String 类型元素,并对这个集合进行遍历。需要注意的是,在使用泛型后,每次遍历集合元素时,可以指定元素类型为 String,而不是 Object。这样就避免了在程序中进行强制类型转换。