泛型机制

  1. 证明泛型擦除
  2. 通过反射绕过编译类型检查
  3. 泛型的编译期检查
  4. 类型检查是检查什么?

泛型就是为了方法的复用,不必再搞个方法重载了,其实就是为了跳过方法重载,因为方法重载冗余代码太多。

证明泛型擦除

泛型擦除在编译阶段发生。

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

×

喜欢就点赞,疼爱就打赏