1. 泛型的引入:
(1)首先我们看看下面这一段代码,如下:
package cn.itcast_01; import java.util.ArrayList;
import java.util.Iterator; public class GenericDemo {
public static void main(String[] args) {
// 创建
ArrayList array = new ArrayList(); // 添加元素
array.add("hello");
array.add("world");
array.add("java");
// array.add(new Integer(100));
array.add(10); // JDK5以后的自动装箱
// 等价于:array.add(Integer.valueOf(10)); // 遍历
Iterator it = array.iterator();
while (it.hasNext()) {
// ClassCastException
// String s = (String) it.next();
String s = it.next();
System.out.println(s);
} }
}
运行上面程序,如下:
(2)泛型的引入:
我们按照正常的写法来写这个程序, 结果确出错了。
为什么呢?
因为我们开始存储的时候,存储了String和Integer两种类型的数据。
而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。
但是呢,它在编译期间却没有告诉我们。
所以,我就觉得这个设计的不好。
回想一下,我们的数组:
String[] strArray = new String[3];
strArray[0] = "hello";
strArray[1] = "world";
strArray[2] = 10; //报错
集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了,而这种技术被称为:泛型。
2. 泛型的概述和使用:
(1)泛型的概述:
泛型是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。
(2)泛型的格式:
<数据类型>
注:此处的数据类型只能是引用类型。
(3)泛型的好处:
• 把运行时期的问题提前到了编译期间
• 避免了强制类型转换
• 优化了程序设计,解决了黄色警告线
3. 使用泛型改进1的代码,如下:
package cn.itcast_01; import java.util.ArrayList;
import java.util.Iterator; public class GenericDemo {
public static void main(String[] args) {
// 创建
ArrayList<String> array = new ArrayList<String>(); // 添加元素
array.add("hello");
array.add("world");
array.add("java");
// array.add(new Integer(100));
//array.add(10); // JDK5以后的自动装箱
// 等价于:array.add(Integer.valueOf(10)); // 遍历
Iterator<String> it = array.iterator();
while (it.hasNext()) {
// ClassCastException
// String s = (String) it.next();
String s = it.next();
System.out.println(s);
} }
}
运行效果如下: