泛型就是为了方法的复用,不必再搞个方法重载了,其实就是为了跳过方法重载,因为方法重载冗余代码太多。
证明泛型擦除
泛型擦除在编译阶段发生。
ArrayList<String> list1 = new ArrayList<>();
list1.add("a");
ArrayList<Integer> list2 = new ArrayList<>();
list2.add(1);
System.out.println(list1.getClass() == list2.getClass()); // true
通过反射绕过编译类型检查
ArrayList<Integer> list1 = new ArrayList<>();
list1.getClass().getMethod("add", Object.class).invoke(list1, "wd");
System.out.println(list1.get(0));
反射得到 可以接收Object类型的add方法,invoke调用此方法。
泛型的编译期检查
泛型的检查是在编译之前的,如果是在编译之后,在执行下面这段代码时应该是能加入的:
ArrayList<String> list = new ArrayList<String>();
list.add("123");
list.add(123);//编译错误
但报错,说明是在编译之前的。
类型检查是检查什么?
检查的是引用。
ArrayList<String> list1 = new ArrayList();
list1.add("1"); //编译通过
list1.add(1); //编译错误
String str1 = list1.get(0); //返回类型就是String
ArrayList list2 = new ArrayList<String>();
list2.add("1"); //编译通过
list2.add(1); //编译通过
Object object = list2.get(0); //返回类型就是Object
new ArrayList<String>().add("11"); //编译通过
new ArrayList<String>().add(22); //编译错误
String str2 = new ArrayList<String>().get(0); //返回类型就是String
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1216271933@qq.com