1. 泛型的概述和基本使用:
1 package cn.itcast_01; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 /* 7 * ArrayList存储字符串并遍历 8 * 9 * 我们按照正常的写法来写这个程序, 结果确出错了。 10 * 为什么呢? 11 * 因为我们开始存储的时候,存储了String和Integer两种类型的数据。 12 * 而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。 13 * 但是呢,它在编译期间却没有告诉我们。 14 * 所以,我就觉得这个设计的不好。 15 * 回想一下,我们的数组 16 * String[] strArray = new String[3]; 17 * strArray[0] = "hello"; 18 * strArray[1] = "world"; 19 * strArray[2] = 10; 20 * 集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了。 21 * 而这种技术被称为:泛型。 22 * 23 * 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。 24 * 格式: 25 * <数据类型> 26 * 此处的数据类型只能是引用类型。 27 * 好处: 28 * A:把运行时期的问题提前到了编译期间 29 * B:避免了强制类型转换 30 * C:优化了程序设计,解决了黄色警告线 31 */ 32 public class GenericDemo { 33 public static void main(String[] args) { 34 // 创建 35 ArrayList<String> array = new ArrayList<String>(); 36 37 // 添加元素 38 array.add("hello"); 39 array.add("world"); 40 array.add("java"); 41 // array.add(new Integer(100)); 42 //array.add(10); // JDK5以后的自动装箱 43 // 等价于:array.add(Integer.valueOf(10)); 44 45 // 遍历 46 Iterator<String> it = array.iterator(); 47 while (it.hasNext()) { 48 // ClassCastException 49 // String s = (String) it.next(); 50 String s = it.next(); 51 System.out.println(s); 52 } 53 54 // 看下面这个代码 55 // String[] strArray = new String[3]; 56 // strArray[0] = "hello"; 57 // strArray[1] = "world"; 58 // strArray[2] = 10; 59 } 60 }
类 ArrayList<E>---像这种加上<E>,都是表示要明确类型
下面我们来改进以前的代码:ArrayList存储字符串并遍历泛型:
1 package cn.itcast_02; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 /* 7 * 泛型在哪些地方使用呢? 8 * 看API,如果类,接口,抽象类后面跟的有<E>就说要使用泛型。一般来说就是在集合中使用。 9 */ 10 public class ArrayListDemo { 11 public static void main(String[] args) { 12 // 用ArrayList存储字符串元素,并遍历。用泛型改进代码 13 ArrayList<String> array = new ArrayList<String>(); 14 15 array.add("hello"); 16 array.add("world"); 17 array.add("java"); 18 19 Iterator<String> it = array.iterator(); 20 while (it.hasNext()) { 21 String s = it.next(); 22 System.out.println(s); 23 } 24 System.out.println("-----------------"); 25 26 for (int x = 0; x < array.size(); x++) { 27 String s = array.get(x); 28 System.out.println(s); 29 } 30 } 31 }
下面我们来改进以前的代码:ArrayList存储自定义对象并遍历泛型
1 package cn.itcast_02; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 /* 7 * 需求:存储自定义对象并遍历。 8 * 9 * A:创建学生类 10 * B:创建集合对象 11 * C:创建元素对象 12 * D:把元素添加到集合 13 * E:遍历集合 14 */ 15 public class ArrayListDemo2 { 16 public static void main(String[] args) { 17 // 创建集合对象 18 // JDK7的新特性:泛型推断。 19 // ArrayList<Student> array = new ArrayList<>(); 20 // 但是我不建议这样使用。 21 ArrayList<Student> array = new ArrayList<Student>(); 22 23 // 创建元素对象 24 Student s1 = new Student("曹操", 40); // 后知后觉 25 Student s2 = new Student("蒋干", 30); // 不知不觉 26 Student s3 = new Student("诸葛亮", 26);// 先知先觉 27 28 // 添加元素 29 array.add(s1); 30 array.add(s2); 31 array.add(s3); 32 33 // 遍历 34 Iterator<Student> it = array.iterator(); 35 while (it.hasNext()) { 36 Student s = it.next(); 37 System.out.println(s.getName() + "---" + s.getAge()); 38 } 39 System.out.println("------------------"); 40 41 for (int x = 0; x < array.size(); x++) { 42 Student s = array.get(x); 43 System.out.println(s.getName() + "---" + s.getAge()); 44 } 45 } 46 }