使用泛型编写类比使用需要在客户端代码中进行转换的类型更加安全,并且对去其他程序员来说更加容易扩展,我们应该将可以用泛型代替的非泛型类优化

那么,如何将类泛型化呢?

这很简单.首先,给他的声明添加一个或者多个类型参数;然后,用相应的类型参数替换所有的Object类型

如:将第六条中的Stack类优化为泛型类

第六条链接:http://blog.csdn.net/jacxuan/article/details/56851123

    public class StackGeneric<E> {
private E[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
//消除强制转换的未受检警告
    @SuppressWarnings("unchecked")
public StackGeneric() {
//不能创建不可具体化的数组
//elements = new E[DEFAULT_INITIAL_CAPACITY];
//1.替换 直接绕过创建数组的禁令 会出现一个unchecked cast 警告
elements = (E[]) new Object[DEFAULT_INITIAL_CAPACITY];
} public void push(E e) {
ensureCapacity();
elements[size++] = e; } public E pop() {
if (size == 0) {
throw new EmptyStackException();
}
//2.将elements域的类型从E[]改为Object[]
E result = (E)elements[--size];
//E result = elements[--size];
elements[size] = null;
return result;
} public boolean isEmpty() {
return size == 0;
} private void ensureCapacity() {
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
}
}

测试堆栈中弹出的元素转换为大写的方法

public static void main(String[] args) {
StackGeneric<String> stack = new StackGeneric<String>();
for(String arg:args){
stack.push(arg);
}
while(!stack.isEmpty()){
System.out.println(stack.pop().toUpperCase());
}
}

在上一条中,我们鼓励优先使用列表而非数组,但是实际上并不是总能在泛型中使用列表

总结:是用泛型比使用需要在客户端代码中进行转换的类型更加安全,更加容易.在设计新类型的时候,要确保他们不需要这种转换就可以使用.这通常意味着要把类做成泛型的.这对于这些类型的新用户来说会更加轻松,又不会破坏现有的客户端.

EffectiveJava(26)使用泛型类替代普通类的更多相关文章

  1. (精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

    Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的. 两大核心概念 1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过se ...

  2. 第一章 Collections 类、泛型类和Timing类概述

    摘抄<数据结构与算法(C#语言描述)> 删除很多废话 1.1群集(collection)的定义 群集是一种结构化的数据类型.存储数据,并且提供数据的添.删.改操作,以及对群集不同属性值的设 ...

  3. 使用SecureRandom类替代Random类

    java.util.Random 产生确定的值可能被恶意的程序预测到. java.security.SecureRandom 产生不确定的随机数不能被预测到. 所以优先使用java.security. ...

  4. C++解析(26):函数模板与类模板

    0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...

  5. EffectiveJava(14)在公有类中使用访问方法而非公有域

    1.公有类永远都不应该暴露可变的域.如果域是不可变的,暴露公有类的危害就要小一些. 但是,有时候需要用包级私有的或者私有的嵌套类来暴露域,无论这个类是否可变 2.如果公有类暴露了它的访问域,要想在将来 ...

  6. 第1章.Collections类、泛型类和Timing类概述

    1.1 群集(collection)的定义 群集是一种结构化的数据类型.它存储数据,并且提供数据的添加.删除.更新操作,以及对群集的不同属性值的设置与返回操作. 群集可以分为两类:线性的和非线性的. ...

  7. JVM如何理解Java泛型类

    //泛型代码 public class Pair<T>{ private T first=null; private T second=null; public Pair(T fir,T  ...

  8. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

  9. Java泛型全解析【接口、类、封装类型】

    目录   1.导读  2.为何需要泛型?   3.泛型的定义格式   3.泛型的好处  4.什么时候使用泛型?   5.泛型的擦除   6.泛型的补偿  7.泛型的应用      7.1[泛型类]   ...

随机推荐

  1. 基于kbengine 0.4.20

    前言: v0.0.1 2015-04-10 誉小痕(shawhen2012@hotmail.com) v0.0.2 2015-04-12 誉小痕(shawhen2012@hotmail.com) ch ...

  2. HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. javascript 的回调函数

    既然函数可以像其他数据那样赋值给某个个变量,可以被定义.删除.拷贝,那为什么就不能被当成参数传递给其他函数呢? 下面的示例中,我们定义了一个以两个函数为参数的函数.该函数会分别执行这两个参数函数,并返 ...

  4. Java HashSet的元素内容变化导致的问题

    概述 HashSet元素引用的对象的内容发生变化,会导致"元素不属于集合"的问题.事实上这个元素还在集合里,但是调用contains方法进行判断,得到的结果却是false. 正文 ...

  5. [UOJ181]密码锁

    这个完全图随机定向后是一个竞赛图,将它的强连通分量缩点后我们得到的东西类似一条链,每个点往它后面的所有点连边 在这条链上,我们可以把点划分为两个点集$S,T$使得没有从$T$中点到$S$中点的边($S ...

  6. 课堂作业-Bag类的实现

    课堂作业-Bag类的实现 要求: 代码运行在命令行中,路径要体现学号信息,IDEA中,伪代码要体现个人学号信息 参见Bag的UML图,用Java继承BagInterface实现泛型类Bag,并对方法进 ...

  7. MYSQL复习笔记11-排序分组

    Date: 20140223Auth: Jin 一.排序 order by作用:对查询结果进行排序1.基本语法SELECT column_name(s) FROM table_name ORDER B ...

  8. 一个简单的MVC模式练习

    控制层Action接受从模型层DAO传来的数据,显现在视图层上. package Action; import java.sql.Connection; import java.sql.SQLExce ...

  9. .net 中两个日期算经过的月份数

    DateTime startDate = DateTime.Parse("2014-11-1"); DateTime endDate = DateTime.Parse(" ...

  10. 用C#写个邮件监控服务(一)

    监控服务,首先当然是个服务了.至于什么是windows服务,这里就不多说了.正题 1. 创建服务项目 打开VS编程环境,在C#中创建windows服务项目 2.创建后属性中更改名称和服务名. 3.增加 ...