如果不使用泛型比如List a=new ArrayList();a.add("123"); a.add(1);因为List取出来的是Object,需要强制转换,String s=(String)a.get(1) ;的时候就出错,因为int强制转换时出错,就有必要使用泛型了,取元素的时候不用强制转换。可以简洁的List<String> a=new ArrayList<>后者不用指定会默认为String。记住List<String>并不是一个新的类型,即不存在泛型类,比如说你用a instanceof List<String>会出错,instance后不能使用泛型类。List<String>的引用a和List<Integer> b的引用a.getClass()==b.geteClass()为true
类型通配符
同样假如不知道传入的类型是什么,比如可以用List<Object>么?答案是不可以,比如我传进入一个List<String>就会出错,因为前者和后者的关系并不是我们熟悉的Object和String的父子关系。此时应该用List<?>来代替,但是同时在添加元素时会出现问题,List<?> a=new ArrayList<String> a.add(new Object());后者编译出错,因为不知道类型参数是什么,除了null外不能添加任何东西进去。当然可以用get()得到元素,返回值总是一个Object的未知类型。
擦除
至于什么是擦除,比如List<Integer> li=new ArrayLIst<>();li.add(5);List list= li;//这段代码因为list没有类型限定,所以会丢失原来li的泛型信息,即为擦除。
继续下去List<String> ls=list;//这段代码会引起未经检查的转换警告,但编译运行正常,至于原因就是list看起来没有泛型限制,直到ls.get(0)试图把里面的元素当成String取出来就会引发运行时异常
上限
比如List<?extends A>表明里面的是一个A的子类或者A本身,很有用处,避免了List<?>的基本没有限制条件,但是也跟上面一样由于不知道?extends A里是什么,企图往里面放东西也是跟List<?>一样会出错的。