import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;

public class FanXing {

    @Test
    public void test1() {
        List arrayList1 = new ArrayList();
        arrayList1.add("abc");
        List arrayList2 = new ArrayList();
        arrayList2.add(123);
        System.err.println(arrayList1.getClass() == arrayList2.getClass());
        
//        我们定义了两个ArrayList数组,不过一个是ArrayList泛型类型,只能存储字符串。
//         一个是ArrayList泛型类型,只能存储×××。
//         最后,我们通过arrayList1对象和arrayList2对象的getClass方法获取它们的类的信息,
//         最后发现结果为true。说明泛型类型String和Integer都被擦除掉了,只剩下了原始类型。 
        
    }
    
    //关于泛型变量的使用,是会在编译之前检查的。
    @Test
    public void test2(){
        try {
            List arrayList3 = new ArrayList();
            arrayList3.add(1);// 这样调用add方法只能存储×××,因为泛型类型的实例为Integer
            //arrayList3.getClass().getMethod("add", Object.class).invoke(arrayList3, "asd");
            Method method=arrayList3.getClass().getMethod("add", Object.class);
            method.invoke(arrayList3, "asdf");
            
            for (int i = 0; i < arrayList3.size(); i++) {
                System.err.println("第"+i+"个元素==="+arrayList3.get(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    @Test
    public void test3(){
        ArrayList arrayList1 = new ArrayList();
        arrayList1.add("1");// 编译通过
        //arrayList1.add(1);// 编译错误
        String str1 = arrayList1.get(0);// 返回类型就是String

        ArrayList arrayList2 = new ArrayList();
        arrayList2.add("1");// 编译通过
        arrayList2.add(1);// 编译通过
        Object object = arrayList2.get(0);// 返回类型就是Object

        new ArrayList().add("11");// 编译通过
        //new ArrayList().add(22);// 编译错误
        String string = new ArrayList().get(0);//返回类型就是String  
        //类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象。
    }
}