泛型在JDK1.5版本被正式引入,具有非常重要的意义,网上有很多文章介绍,本文只是对使用过程中遇到的一些问题进行总结,当作笔记使用。 先来看一段没有使用泛型的代码:
public class TypedTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("江苏");
list.add("浙江");
for(int i = 0; i < list.size(); i++) {
String str = (String)list.get(i);
System.out.println(str);
}
}
}
输出结果:
江苏
浙江
Process finished with exit code 0
从以上输出结果看很难发现有什么问题,我们在list中再插入一个值重新运行看一下结果。
public class TypedTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("江苏");
list.add("浙江");
list.add(1);//插入一个数字
for(int i = 0; i < list.size(); i++) {
String str = (String)list.get(i);
System.out.println(str);
}
}
}
运行以上代码直接报Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String异常。这个异常大家都很熟悉,无需在这里解释,当然如果在项目中发生这种问题是非常致命,本例只是一个简单的例子来模拟这种场景,光看这个例子本身可能会觉得自己写代码不可能会发生这样的问题,换个角度再想想,如果把这个例子想像成生产者和消费者,生产数据是由A这个人负责,消费数据是由B这个人负责。如果A生产数据时候换了数据类型,B不知道,那就会发现类型转换异常。那如何规避这个问题呢?为了解决这样的问题,Java引入了泛型机制。
下面将上述例子改成使用泛型:
public class TypedTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); //指定类型为String
list.add("江苏");
list.add("浙江");
list.add(1);//添加数字编译不通过
for(int i = 0; i < list.size(); i++) {
String str = (String)list.get(i);
System.out.println(str);
}
}
}
我们在声明的时候通过
此篇文章只是做个引子,后面会陆续讲解泛型的底层原理以及存在的弊端。