package com.sxt.genericdemo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
-
为什么需要学习泛型(Generic)?
-
在JDK1.5之前是没有泛型,当时集合能够存储的都是使用父类Object类型作为形参接受所有的类型
-
如果存储的是同一种类型向下转型没问题,如果集合存储的是不同类型,那么会出现ClassCastException类型转换异常
-
所以我们在转型之前做类型判断,判断后虽然解决了安全问题,但是又出现了 遍历不完全的情况,所以我们需要针对Object
-
可能出现的子类做逐一判断,判断后解决了遍历不完整和安全问题,但是如果集合又添加了一个新的类型的元素,遍历又不
-
完整,需要继续添加else if语句块,所以违背了开闭原则,不好维护,可以违背开闭原则,但是又因为Object类有无数个
-
子类,所以永远无法解决,所以引入了泛型
-
泛型是模仿数组 和 方法的特点:
-
模仿数组的 编译时期 确定类型
-
模仿方法的 参数化类型
-
泛型的概述: 泛型是一种独立的技术,和集合无关,是能够将类型在编译时期提前确定的参数化类型
-
泛型的格式: 这里的E必须是引用数据类型,这里可以A~Z
-
泛型的好处:
-
1.消除了黄色警告线,提高了安全性
-
2.去除了向下转型,提高了效率
-
3.满足了开闭原则 (提高了扩展性和可维护性)
-
4.提高了可读性
-
5.简化了代码
*/
public class GenericDemo01 {// 模仿方法的 参数化类型
public static double add(double a, int b) {
double sum = a + b;
sum = sum + a;
sum = sum - b;
sum = a - b;
return sum;
}public static void main(String[] args) {
// 模仿数组的 编译时期 确定类型
String[] strs = new String[3];
strs[0] = “abc”;
for (String s : strs) {
System.out.println(s);
}Collection<String> c = new ArrayList<String>(); c.add("123"); /*c.add(28); c.add(new Employee()); c.add(2.5);*/ c.add("efg"); c.add("hij"); // 遍历集合 泛型的传染性(个人理解,不是官方的定义) Iterator<String> it = c.iterator(); /*while (it.hasNext()) { Object obj = it.next(); // 希望访问每一个元素子类所特有的方法 // 访问 String 的 length Ineger 的 intValue 以及 员工 getName和getAge方法 if (obj instanceof String) { String s = (String) obj; System.out.println(s + "|" + s.length()); } else if (obj instanceof Integer) { Integer i = (Integer) obj; System.out.println(i + "|" + i.intValue()); } else if (obj instanceof Employee) { Employee e = (Employee) obj; System.out.println(e.getName() + "|" + e.getAge()); } }*/ while (it.hasNext()) { String s = it.next(); System.out.println(s + "|" + s.length()); }
}
}