case回顾
1 public void fun1(){ 2 HashMap<Integer,String> map = new HashMap<>(); 3 fun2(map); 4 } 5 public void fun2(Map map){ 6 map.put("我是字符串不是数值","awful"); 7 }
这里省略了main方法,我们发现第六行是可以正常执行的。是不是很奇怪。而且执行之后,我去从map中取数据(我以为key是int的 结果怎么都取不到 发现存的是一个String类型的key 心好累)
后来参考这篇博文 http://blog.csdn.net/lonelyroamer/article/details/7868820
找到了问题的原因,根源就在java的泛型上。
『类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象』
1 public class Test10 { 2 public static void main(String[] args) { 3 4 // 5 ArrayList<String> arrayList1=new ArrayList(); 6 arrayList1.add("1");//编译通过 7 arrayList1.add(1);//编译错误 8 String str1=arrayList1.get(0);//返回类型就是String 9 10 ArrayList arrayList2=new ArrayList<String>(); 11 arrayList2.add("1");//编译通过 12 arrayList2.add(1);//编译通过 13 Object object=arrayList2.get(0);//返回类型就是Object 14 15 new ArrayList<String>().add("11");//编译通过 16 new ArrayList<String>().add(22);//编译错误 17 String string=new ArrayList<String>().get(0);//返回类型就是String 18 } 19 }
这个例子和上面那个例子一样,这是很多人都容易踩到的坑。