GenericDemo2 泛型类的使用

/**
 *    泛型的前世今生(泛型类的使用)
 *    【学习结果】
    1,了解泛型类,泛型方法,泛型接口的定义体现形式。
    2,自定义泛型类,体会泛型前和泛型后的区别★★★★★
    【目标:自定义泛型】
    1,没有泛型之前,对于不确定的对象类型,是通过Object类型多态方式解决的。
         弊端:当对象提升为Object后,需要向下转型才可以使用对象的内容。
         而转型就会有运行发生ClassCastException异常的风险。
    2,有了泛型后,将不确定的类型定义成参数,把Object替换成参数类型。
        好处是:1.调用者在使用时必须先明确类型,如果操作的对象类型不符符合,直接编译失败。
           2.类型符合,使用对象特有方法时,不需要进行强制转换。
    3,泛型类,泛型方法,泛型接口的体现。
    4,注意:
        4.1 类上的泛型是在创建该类对象时进行类型明确。
        4.2 静态方法无法访问类上定义的泛型,如果需要泛型,只能定义在方法上。
 */
public class GenericDemo2 {
 
    public static void main(String[] args) {
    //part2:
//        ObjTool tool = new ObjTool();
//        tool.setObj("hehe");
//        String str = tool.getObj();    //编译出错,原因在于传参时存的是Obj类型,向上造型.
//        String str = (String) tool.getObj();
//        System.out.println(str);
 
        //用户传入数字6
//        tool.setObj(6);    //编译没问题,因为6也造型为Object,语法上没问题.
//        String six = (String) tool.getObj();    //我们用同样的方法取数值发现
        //java.lang.ClassCastException: 类型转换异常
        /*JDK1.5之前,就是用Object这样的办法,来扩展类型 
         *但是在需要特有功能时,需要强转,麻烦.另外还有可能引发运行异常*/
    //part3:
        ObjTool<String> tool = new ObjTool<String>();
        tool.setObj("haha");
        String str = tool.getObj();    //1.无需强转了
//        tool.setObj(6);    //2.编译失败.类型不匹配,编译就报错,避免了运行时的类型异常.
    }
}
/**part4: 将曾经的模拟队列数据结构加上泛型
 *    定义自制队列数据结构
 *    模拟用  遵循先进后出
 */
class MyQueue<Q> {
    /*封装一个链表数据结构*/
    private LinkedList<Q> queue;
 
    /*注意:初始化MyStack
     * new一个链表数据结构的列表*/
    public MyQueue(){
        queue = new LinkedList<Q>();
    }
 
    //模拟queue添加元素的方法(栈添加的是尾部的元素,也就是先进入的元素放在尾部)
    public void add(Q obj){
        queue.addFirst(obj);
        //注意:存入的元素顺序,每一个在下一个的前面位置存放.
    }
 
    //模拟queue获取元素的方法(栈获取的是尾部的元素,也就是先入的元素)
    public Object get(){
        return queue.removeLast();
        //注意1.因为是模拟队列,不能用LinkedList的get方法,那样不会移除头部的元素.
        //     2.移除的是每次尾部的元素.根据上面add方法所述,即最先进入的元素在尾部,所以会先移除.
        //     这样才符合栈的数据结构特点: 先进先出. 或者说后进后出.
    }
 
    //判断stack是否为空
    public boolean isEmpty(){
        return queue.isEmpty();
    }
}
 
/**
 *    part1:
 *    定义一个工具,对对象进行操作,比如设置和获取
 *    注意:现在的Tool只能操作String,如果现在还需要操作Integer类型的获取和设置.
 *    那么需要在建立一个类,定义成Tool2 get ,setInteger方法,显然很麻烦.
 *     那么就需要把String和Integer的共性部分向上抽取,即共性类型Object类型.
 *    所以可以写成如下ObjTool.  看part2:
 *    part3: jdk1.5有了新技术,泛型,改成如下这样。
 *    类中操作的对象确定不?不确定,用Object,需要转型,运行容易出异常。不爽。
 *    在定义时,就将不确定的对象的类型,定义成参数。由使用该类的调用者来传递对象类型。
 */
class ObjTool <T>{    //将泛型定义在类上,叫做泛型类
    private T obj;
 
    public T getObj() {
        return obj;
    }
 
    public void setObj(T obj) {
        this.obj = obj;
    }
}
/*class ObjTool {    //实验完毕注释掉 part2
    private Object obj;
 
    public Object getObj() {
        return obj;
    }
 
    public void setObj(Object obj) {
        this.obj = obj;
    }
}*/
 
/*class Tool {    //实验完毕注释掉
    private String str;
 
    *//**
     * 获取str
     * @return
     *//*
    public String getStr() {
        return str;
    }
 
    *//**
     * 设置str
     * @param str
     *//*
    public void setStr(String str) {
        this.str = str;
    }
}*/

 

posted @ 2016-05-02 22:49  安仔80  阅读(189)  评论(0编辑  收藏  举报