EffectiveJava(26)使用泛型类替代普通类
来源:互联网 发布:正归淘宝店加盟 编辑:程序博客网 时间:2024/05/16 08:49
使用泛型编写类比使用需要在客户端代码中进行转换的类型更加安全,并且对去其他程序员来说更加容易扩展,我们应该将可以用泛型代替的非泛型类优化
那么,如何将类泛型化呢?
这很简单.首先,给他的声明添加一个或者多个类型参数;然后,用相应的类型参数替换所有的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()); } }
在上一条中,我们鼓励优先使用列表而非数组,但是实际上并不是总能在泛型中使用列表
总结:是用泛型比使用需要在客户端代码中进行转换的类型更加安全,更加容易.在设计新类型的时候,要确保他们不需要这种转换就可以使用.这通常意味着要把类做成泛型的.这对于这些类型的新用户来说会更加轻松,又不会破坏现有的客户端.
11 0
- EffectiveJava(26)使用泛型类替代普通类
- EffectiveJava-1.考虑使用静态工厂方法替代构造方法
- EffectiveJava(20)使用子类型化优化标签类
- EffectiveJava(7)避免使用终结方法
- EffectiveJava(14)在公有类中使用访问方法而非公有域
- EffectiveJava(24)使用@SuppressWarnings("unchecked")消除非受检警告
- EffectiveJava(27)优先考虑使用泛型方法
- EffectiveJava-类和接口
- EffectiveJava
- EffectiveJava
- EffectiveJava(18)接口优先于抽象类
- EffectiveJava学习笔记(1)
- EffectiveJava 学习总结(一)
- EffectiveJava 学习总结(二)
- EffectiveJava 学习总结(三)
- mongoDB 性能优化:如何使用普通查询语句替代 aggregate 操作?
- 使用 .NET 框架类替代 API 调用 (二)
- EffectiveJava(2)应对多个构造函数应当使用构建器
- C++集合运算函数总结-merge、set_union、set_difference、set_symmetric_difference、set_intersection
- C++11 std::chrono库详解
- 【数据库】从零开始学MySQL数据库语法
- 向量几何在游戏编程中的使用6
- 企业数据(从天眼)抓取
- EffectiveJava(26)使用泛型类替代普通类
- Leetcode #349 Intersection of Two Arrays
- html里面输出大于号和小于号
- 运动目标检测_帧差法
- SQL2012 问题Saving changes is not permitted. (修改表时无法保存)
- HTML学习
- ubuntu连接xshell
- A* 寻路算法
- L2-002. 链表去重