泛型类和泛型接口

声明一个或者多个类型参数的类或者接口.

为什么不要在新代码中使用原生态类型

原生态类型,即泛型不带参数的类型 如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)为什么不能在新生代码中使用原生态类型的更多相关文章

  1. EffectiveJava——请不要在代码中使用原生态类型

    先看一个栗子,看看能不能找出来里面的错误: /** * 请不要在新代码中使用原生态类型 * @author weishiyao * */ public class Test { public stat ...

  2. effective_java第23条:请不要新代码中使用原生态类型

    从这条开始涉及泛型相关的点. 从JDK5开始Java新增了“泛型”新特性,例如:List<String>,在这之前则只有List不会限定类型. 如今的JDK版本中还是可以写原生类型,但这会 ...

  3. Dynamics AX 2012 R2 从代码中调用SSRS Report

    平时,我们制作SSRS Report的方法主要有两种:使用Query或RDP.如果需要为报表传递参数,就要在代码中为报表参数赋值,然后在代码中调用报表.下面我总结下这两种报表在代码中传参和调用的方式: ...

  4. 在Visual Studio代码中使用Flask

    Flask是一个用于Web应用程序的轻量级Python框架,它提供了URL路由和页面呈现的基础知识. Flask被称为“微”框架,因为它不直接提供表单验证,数据库抽象,身份验证等功能.这些功能由称为F ...

  5. EffectiveJava(28)怎么利用有限制的通配符类型来提升API的灵活性

    有时候,我们需要的灵活性要比不可变类型所能提供的更多.所以针对一些通用性的方法,通常用泛型代替固定的数据类型,特别是当你要将某个方法打包成Jar的时候. 结合之前的例子,我们增加尝试用有限制的通配符类 ...

  6. 「Flink」Flink中的时间类型

    Flink中的时间类型和窗口是非常重要概念,是学习Flink必须要掌握的两个知识点. Flink中的时间类型 时间类型介绍 Flink流式处理中支持不同类型的时间.分为以下几种: 处理时间 Flink ...

  7. C语言初学者代码中的常见错误与瑕疵(23)

    见:C语言初学者代码中的常见错误与瑕疵(23)

  8. 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)

    问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...

  9. C语言初学者代码中的常见错误与瑕疵(5)

    问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将 ...

随机推荐

  1. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  2. django的setting文件更换了位置需要进行的更改

    1. Pycharm --> 工具栏 --> Edit Configurations --> 修改 settings 文件 2. 项目文件夹下的wsgi.py 3. 项目文件夹下的m ...

  3. AC日记——Card Game codeforces 808f

    F - Card Game 思路: 题意: 有n张卡片,每张卡片三个值,pi,ci,li: 要求选出几张卡片使得pi之和大于等于给定值: 同时,任意两两ci之和不得为素数: 求选出的li的最小值,如果 ...

  4. HTTP 协议基本知识

    HTTP协议    7.1.什么是HTTP协议:        HTTP协议是用来规定浏览器客户端和服务器通信的方式 7.2.基本原则        基于请求响应模型        一次请求对应一次响 ...

  5. 服务器重启之后wdcp打不开【解决】

    service wdapache restart

  6. Problem C: 机器翻译【stl-队列】

    Problem C: 机器翻译 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 54  Solved: 27[Submit][Status][Web Bo ...

  7. HDU 5695 Gym Class && 百度之星 初赛 1006

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5695 本文链接:http://www.cnblogs.com/Ash-ly/p/5515234.htm ...

  8. python3 base64解码出现TypeError:Incorrect padding

    今天在解决爬虫对加密参数的分析时,需要使用到base64解码.但是过程中出现了TypeError:Incorrect padding的错误提示.以下是解决方法,以便查阅. 其实正常使用base64是不 ...

  9. HDU 2256 Problem of Precision (矩阵快速幂)(推算)

    Problem of Precision Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  10. 如何加快exp/imp的速度 - direct=y

       http://blog.itpub.net/35489/viewspace-613625 Oracle9i 或 10g  . 1.  内存中关系到exp的速度的是  large_pool_siz ...