泛型的使用
来源:互联网 发布:宋喆 知乎 编辑:程序博客网 时间:2024/05/17 23:32
如果不使用泛型比如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<?>一样会出错的。
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- 泛型的使用
- c#泛型的使用
- android常用动画举例
- 使用范围for语句和while循环以及传统for的区别
- Google chrome安装Shadowsockets过程记录
- Cocoapods 的安装 及使用
- Java 回顾笔记_多线程_1
- 泛型的使用
- 大数相乘
- STL与泛型编程<一>:容器的共通能力和共通操作
- UI进阶第八天,触摸事件,画板步骤
- 文章收起与展开效果的实现
- pat 1074 Reversing Linked List (25)
- 图层渲染
- HDOJ 1068 Girls and Boys(二分图匹配 + 镜像构图)
- 线程相关题