Effective Java之请不要在新代码中使用原生态类型(二十三)
1.泛型与原生态类型的概念
泛型就是带一个或多个类型参数E的类或者接口,而原生态类型是不带任何实际类型的泛型,例如List是原生态类型,List < String >或者List< E >是泛型。
2.泛型的作用
泛型是在jdk1.5之后添加的。
举个例子:
public class test {public static void main(String[] args) {ArrayList list = new ArrayList();list.add(new Integer(2));String s = (String) list.get(0);}
}
就会在运行时抛出
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat wqeqw.test.main(test.java:10)
然而添加了泛型
public class test {public static void main(String[] args) {ArrayList<String> list = new ArrayList();list.add(new Integer(2));//不用显式声明类型转换String s = list.get(0);}
}
就会在编译时抛出
The method add(String) in the type ArrayList<String> is not applicable for the arguments (Integer)
而且不用显式声明类型转换。
总结:泛型的作用是将jdk1.5以前在运行期间容易发生问题的强制类型转换问题提前到编译期间检查。
3.List<Object>和List的区别
先看一个例子:
public class test2 {public static void main(String[] args) {List<String>lists= new ArrayList<String>();test2.add(lists, 123);String string = lists.get(0);}public static void add(List list,Object o) {list.add(o);}
}
这里依然会发生强制转换的问题,原因是List< String >是List的子类,借此,可以通过多态这种小把戏,能让List< String >做出“出格”的行为。
而List< String >并不是List< Object >的子类,可以在编译期间就检查,防止做出小把戏。
//将List换成List<Object>
public static void add(List<Object> list,Object o) {list.add(o);}
就会在编译期间发现小把戏:
The method add(List<Object>, Object) in the type test2 is not applicable for the arguments (List<String>, int)
总结:List原生类型避免了类型检查,失去安全性,后者明确告诉编译器能够持有任何类型的对象。
4.List<?>和List的区别
?是无限制通配符类型
下面来看一个例子:
public class test3 {public static void main(String[] args) {Set<String>sets1= new HashSet<String>();test3.add(sets1);test3.add2(sets1);}public static void add(Set s) {s.add(1);}//The method add(capture#1-of ?) in the type Set<capture#1-of ?> is not applicable for the arguments (int)public static void add2(Set<?> s) {s.add(1);}
}
这里在List< String >中添加Integer元素,add2方法出现编译错误。
这里实际上耍的小把戏,跟上面的例子一样,List< ? >在这里做的事情是不能将任意元素(除了null)添加到List< ? >中,这就杜绝了小把戏的出现。
但是这样的编译错误让人无法接受,无法将任意元素添加到List< ? >中,那要他有何用,于是有限制的通配符在这里就派上了用场。
总结:这里List< ? >无限制通配符的作用仅仅是防止强制类型转换问题的发生,并没有实际的作用。
5.适合原生态类型的情况
1.规范中要求:在类文字中必须用原生态类型List
比如List.class
而不能List< String >.class
2.由于泛型类型在运行时是可以擦除的,所以在xx instanceof List
这样的语句中是没有问题的,变成xx instanceof List<?>
反而是多余的。
总之,原生态类型只是为了与引入泛型之前的遗留代码进行兼容而提供的,除了类文字,instance两种情况,否则不要在新代码中国使用原生态类型。
Effective Java之请不要在新代码中使用原生态类型(二十三)相关推荐
- Effective Java 泛型 第23条:请不要在新代码中使用原生态类型
java1.5发行版本中增加了泛型.在没有泛型之前,从集合中读取到的每一个对象都必须进行装换.如果有人不小心插入了类型错误的对象,在运行时的装换处理器就会出错.有了泛型之后,可以告诉编译器每个集合中接 ...
- java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大。
java面试题25 在程序代码中写的注释太多,会使编译后的程序尺寸变大. A:正确 B:错误 蒙蔽树上蒙蔽果,蒙蔽树下你和我 拿到这道题,我觉得说的贼有道理,注释太多,尺寸变大.无疑与就和驾考 一样, ...
- java注释里加_如何在代码中添加注释
什么是代码注释,如何在代码中添加注释,相信每一位了解编程的人并不陌生.注释里往往有很多有趣的脑洞和「真心话」.今天我们一起去看看那些6到飞起,被玩坏了的幽默注释吧. 信息量太大的注释系列-- 1.你造 ...
- java按顺序售票方法_java_Java代码实践12306售票算法(二),周五闲来无事,基于上一篇关 - phpStudy...
Java代码实践12306售票算法(二) 周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述) 1.订票工具类 1.1 ...
- java ip加密如何访问_java代码中如何实现http访问
作者:释怀Na 出自:CSDN 原文:blog.csdn.net/qq_35906921/article/details/98076258 java代码中如何实现http访问 大概的实现就是 请求ht ...
- java 魔鬼数字_什么是代码中的魔鬼数字,如何解决?
魔鬼数字的定义:在代码中没有具体含义的数字.字符串. 魔鬼数字主要影响了代码可读性,读者看到的数字无法理解其含义,从而难以理解程序的意图.当程序中出现的魔鬼数字过多时,代码的可维护性将会急剧下降,代码 ...
- java keypress事件_javaweb开发-js代码中keypress事件调用判断,取得keyCode值
在js代码中的一段代码,keypress事件调用的函数中的代码. var keyCode = event.keyCode ? event.keyCode : event.which ? event.w ...
- Java / JavaScript 用正则表达式去匹配代码中的单行注释,用以查找或删除注释。
RT,不爱写注释,看老代码没有注释的情况总是让人抓狂,更有领导要求删掉注释的,如果一行一行的去找注释再手动删除未免浪费时间.本文从正则匹配角度去解决这个问题,实现全局替换,删除注释或查看的目的. 示例 ...
- Effective Java之使类和成员的可访问性最小化(十三)
对于类 对于类,只有public和package-private两种访问级别. 1.对于顶层的类来说,只有包级私有和公有两种可能,区别是包级私有意味着只能在当前包中使用,不会成为导出api的一部分,而 ...
最新文章
- 面向对象之数值的悲剧(8月28日会议有感)
- promehteus 监控超时_07 . Prometheus监控Memcached并配置Grafana
- 第四章:Java_面向对象编程(二)
- React开发(144):Git Commit 规范
- python循环迭代_Python中循环迭代的重做
- tomcat下的公共jar包配置
- HiveQL整理总结
- 不懂APS系统?十个问答让你瞬间了解APS高级计划与排程系统
- 1.C语言的特点和学习目标
- 贪心算法——汽车加油问题
- 计算机科研 感悟1
- 文明城市测评怎么进行?这里有答案
- 图中连通块的个数:并查集
- C# 加密-密钥容器
- 基于STM32 Cortex-M3内核F103制作的智能小车项目
- 儿童用台灯用白光好还是暖光好?推荐儿童使用的暖光台灯
- php wmf png,php – 无法使用Imagemagick将SVG转换为WMF
- Docker容器时间与宿主机不一致?3个解决方案
- 麒麟Kylin-V10-arm64-操作系统永久修改分辨率——趟坑
- 彻底删除PCTOOLS.DLL文件的方法