package cn.itcast_01;


import java.util.ArrayList;

import java.util.Iterator;


/*

 * ArrayList存储字符串并遍历

 * 

 * 我们按照正常的写法来写这个程序, 结果确出错了。

 * 为什么呢?

 * 因为我们开始存储的时候,存储了String和Integer两种类型的数据。

 * 而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错

 *

 * 但是呢,它在编译期间却没有告诉我们。//其实在Myeclipse中已经告诉你了,黄色警告线就告诉你了,这里隐含着类型安全问题,为什么有警告线,就是为了告诉你这里容易出问题


 * 所以,我就觉得这个设计的不好。


 * 回想一下,我们的数组

 * String[] strArray = new String[3];

 * strArray[0] = "hello";

 * strArray[1] = "world";

 * strArray[2] = 10;




 * 集合也模仿着数组的这种做法,在创建对象的时候明确元素数据类型。这样就不会在有问题了。

 * 而这种技术被称为:泛型。

 * 

 * 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型把类型当作参数一样的传递。(也就是说一开始不明确,到创建对象或者调用方法的时候才明确)

 * 比如 一开始我不明确什么类型,但是一造对象ArrayList<String> array = new ArrayList<String>();就要明确,为什么呢?因为集合说了集合可以放任何任意类型,而我知道我的集合放字符串,我就告诉你我放字符串

 * 我知道我放学生,我就告诉你ArrayList我放学生   还有就是 只要在API看到这种 Iterator<E>就要明确类型


 * 格式:

 * <数据类型>

 * 此处的数据类型只能是引用类型。

 * 好处

 * A:把运行时期的问题提前到了编译期间

 * B:避免了强制类型转换

 * C:优化了程序设计,解决了黄色警告线

 */

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)); Integer是一个引用类型,而add()方法里面接收的是object类型,引用类型是object类型的一种

//array.add(10); // JDK5以后的自动装箱,把这个通过反编译工具,反编译之后,为add.(Integer.valueof(10))

// 等价于:array.add(Integer.valueOf(10));


// 遍历

Iterator<String> it = array.iterator();

while (it.hasNext()) {

// ClassCastException

// String s = (String) it.next();//这里要把Integer类型转化为字符类型,所以要报错,前三个可以,最后一个要报错

String s = it.next();

System.out.println(s);

}


// 看下面这个代码

// String[] strArray = new String[3];

// strArray[0] = "hello";

// strArray[1] = "world";

// strArray[2] = 10;这里要报错

}

}