泛型的使用

如果不使用泛型比如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<?>一样会出错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值