java泛型
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
//类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象。
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.