EffectiveJava(23)为什么不能在新生代码中使用原生态类型
泛型类和泛型接口
声明一个或者多个类型参数的类或者接口.
为什么不要在新代码中使用原生态类型
原生态类型,即泛型不带参数的类型 如List的list,list就是其原生态类型
1.使用原生态类型,插入数据时,IDE会绕过编译,从将错误升级成运行时错误.而此时如果你写的代码已经离原生态类型很远,那么错误将很难调试.
如:
private final Collection stamps = ...;
stamps.add(new Coin(...));
我们知道尝试取出这个类型时才会显示错误
for(Iterator i = stamps.iterator();it.hasNext();){
//这里将会抛出一个类型转换异常(ClassCastException)
Stamp s = (Stamp)i.next();
}
使用泛型
private final Collection<Stamp> stamps = ...;
stamps.add(new Coin(...));
此时当stamps集合中添加非stamp元素时,编译器会直接报错,显示类型错误(error type)
2.从集合中删除元素时不再需要进行手工转换.编译器会为我们插入隐式的转换并确保他们不会失败.(使用泛型)
如:
for(Stamp s:stamps){
//Do something
}
//传统循环
for(Iterator<Stamp> i = stamps.iterator();i.hasNext()){
Stamp s = i.next();
//Do Something
}
移植兼容性:代码必须合法,才能将参数化的实例传递给那些被设计城市用普通类型的方法,反之亦然.
List 和 List<Object>
List将会失去安全性
public static void main(String[] args){
List<String> strings = new ArrayList<String>();
unsafeAdd(strings,new Integer(42));
String s = string.get(0);
}
private static void unsafeAdd(List list,Object o){
list.add(o);
}
它可以被编译,但是会因为使用原生态类型收到一条警告.如果换成
private static void unsafeAdd(List<Object> list,Object o){
list.add(o);
}
将无法通过编译
3.即使你不确定或不在乎集合元素类型,也要使用无限制的通配符类型来充当泛型的参数类型
static int numElementsInCommon(Set s1,Set s2){
int result = 0;
for(Object o1:s1){
if(s2.contains(01))
result++;
}
return result;
}
----->>>>
static int numElementsInCommon(Set<?> s1,Set<?> s2){
你可以将任何元素插入到原生态类型中,但你不能把除了null以外的任何元素放入set<?>中,否则将会报错
那我们在何时可以使用原生态类型呢?如果不能被使用,那java为什么不移除它?
确实有两种特殊情况使用原生态类型的例子
a.在类文字中必须使用原生态类型.规范不允许使用参数化类型.
如:List
if(o instanceof Set){
//受检转换
Set<?> m = (Set<?>)o;
}
总结:使用原生态类型会在运行时导致异常,因此不要在新代码中使用.原生态类型只是为了引入泛型之前遗留代码进行兼容和互用而提供的.
Set 是个参数化类型,表示可以包含任何对象类型的一个集合 safe
Set
EffectiveJava(23)为什么不能在新生代码中使用原生态类型的更多相关文章
- EffectiveJava——请不要在代码中使用原生态类型
先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public stat ...
- effective_java第23条:请不要新代码中使用原生态类型
从这条开始涉及泛型相关的点. 从JDK5开始Java新增了“泛型”新特性,例如:List<String>,在这之前则只有List不会限定类型. 如今的JDK版本中还是可以写原生类型,但这会 ...
- Dynamics AX 2012 R2 从代码中调用SSRS Report
平时,我们制作SSRS Report的方法主要有两种:使用Query或RDP.如果需要为报表传递参数,就要在代码中为报表参数赋值,然后在代码中调用报表.下面我总结下这两种报表在代码中传参和调用的方式: ...
- 在Visual Studio代码中使用Flask
Flask是一个用于Web应用程序的轻量级Python框架,它提供了URL路由和页面呈现的基础知识. Flask被称为“微”框架,因为它不直接提供表单验证,数据库抽象,身份验证等功能.这些功能由称为F ...
- EffectiveJava(28)怎么利用有限制的通配符类型来提升API的灵活性
有时候,我们需要的灵活性要比不可变类型所能提供的更多.所以针对一些通用性的方法,通常用泛型代替固定的数据类型,特别是当你要将某个方法打包成Jar的时候. 结合之前的例子,我们增加尝试用有限制的通配符类 ...
- 「Flink」Flink中的时间类型
Flink中的时间类型和窗口是非常重要概念,是学习Flink必须要掌握的两个知识点. Flink中的时间类型 时间类型介绍 Flink流式处理中支持不同类型的时间.分为以下几种: 处理时间 Flink ...
- C语言初学者代码中的常见错误与瑕疵(23)
见:C语言初学者代码中的常见错误与瑕疵(23)
- 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)
问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...
- C语言初学者代码中的常见错误与瑕疵(5)
问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将 ...
随机推荐
- DRF的过滤与排序
过滤 对于列表数据可能需要根据字段进行过滤,我们可以通过添加 django-filter 扩展来增强支持. pip install django-filter 在配置文件中增加过滤后端的设置: INS ...
- win32 listctrl控件右键菜单的实现
HMENU Menu_list,Menu_all; POINT point; HINSTANCE hInstance;//下面代码放到BOOL WINAPI DialogProc下 case WM_C ...
- selenium 多窗口切换(windows)
在web应用中,常常会遇见点击某个链接会弹出一个新的窗口,或者是相互关联的web应用 ,这样要去操作新窗口中的元素,这时就需要主机切换到新窗口进行操作..WebDriver 提供了switchTo() ...
- python-函数(装饰器)
装饰器 装饰器的主要功能: 在不改变函数调用方式的基础上在函数的前.后添加功能. 装饰器的固定格式: #装饰器的本质 :闭包函数 #功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 ...
- React Native - 2 控件Flexbox
*强烈建议使用Genymotion模拟器,比AVD速度快,功能强大. 1. flexDirection Flexbox是连续布局,它有主轴(primary axis)和交叉轴(cross axis ...
- atom 插件
来源 个人博客 http://taoquns.com/paper/59ba5627a157197cdcc0a012 输入类 autocomplete-plus emmet go-to-line ato ...
- Ubuntu 16.04 win7 双系统时间问题
在安装了win7的电脑上又装了一个Ubuntu 16.04,这Ubuntu的启动速度慢就选不说了,切加win7之后发现时间也不对啊. 所以记一个随笔记录一下自己修改双系统的日期. 当然,网上也搜过,说 ...
- selenium grid 环境搭建
一.selenium grid简介 selenium grid可以同时在不同机器上测试不同浏览器,包含一个hub和多个node.node会发送配置信息到hub,hub记录并跟踪每一个node的配置信息 ...
- POJ2342 Anniversary party(动态规划)(树形DP)
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6635 Accepted: 3827 ...
- 谜题15:令人晕头转向的Hello
下面的程序是对一个老生常谈的例子做出了稍许的变化之后的版本.那么,它会打印出什么呢? /** * Generated by the IBM IDL-to-Java compiler, version ...