zoukankan      html  css  js  c++  java
  • 谈谈我眼中的泛型

               非常早的时候我就接触了泛型,可是那个时候并不了解泛型有什么优点,在抽象的过程中使用泛型,后来接触到了gxpt系统,这个系统框架中,用的是泛型方法.那个时候仅仅是知道这么用,说是能够解决反复写代码的问题,可是我并没有体会到,后来接触了Itoo 这个框架,这个里面用的是泛型类,同一时候我正在的參与到这个系统中,在跟gxpt相比,我体会到了使用泛型的优点.

    一.介绍

             泛型是Java SE 1.5的新特性。泛型的本质是參数化类型。也就是说所操作的数据类型被指定为一个參数。

    这样的參数类型能够用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。


    二.解决这个问题

             在JDK1.5 还没有泛型的时候,通过使用类型Object的来实现參数的”随意化”.实现參数随意化须要对显式进行强制类型转换.并且这样的强制转换要求开发人员对实际參数类型是预知的.对于强制类型转换错误的情况,编译器可能不提示错误,在执行的时候才出现异常,这是一个非常大的安全隐患.假设使用泛型,就能够在编译阶段就发现这个错误,并且全部的强制转换都是自己主动和隐式的,再一次提高了代码的复用率.总结一句话就是泛型解决抽象过程中须要显式强制转换的问题,把主动变成被动,再次提高代码的复用率.

     

    三.实例

    无泛型,使用Object+强制转换实现抽象:

    <span style="font-size:18px;">/**
     * 使用Object 类型,显示须要强制转换
     * @author huan
     *
     */
    public class NoGen {
    	private Object ob; //定义泛型成员变量
    	
    	public NoGen(Object ob){
    		this.ob=ob;
    	}
    	public Object Getob(){
    		return ob;
    	}
    	
    	public void setOb(Object ob){
    		this.ob=ob;
    	}
    	
    	public void showType(){
    		System.out.println("T的实际类型是:" +ob.getClass().getName());
    	}
    }
    
    public class GenDemo2 {
    	public static void main(String[] args) {
    		//定义泛型类NoGen 的一个Integer版本号
    		NoGen intOb=new NoGen(new Integer(88));
    		intOb.showType();
    		int i=(int) intOb.Getob();
    		System.out.println("Value="+i);
    		System.out.println("------------------");
    		
    		//定义泛型类Gen的一个String版本号
    		NoGen strOb=new NoGen("Hello Gen!");
    		strOb.showType();
    		String s=(String) strOb.Getob();
    		System.out.println("value="+s);
    	}
    }
    </span>

    相应类图:



    使用泛型实现抽象:


    <span style="font-size:18px;">public class Gen<T> {
    	private T ob; //定义泛型成员变量
    	
    	public Gen(T ob){
    		this.ob=ob;
    	}
    	public T Getob(){
    		return ob;
    	}
    	
    	public void setOb(T ob){
    		this.ob=ob;
    	}
    	
    	public void showType(){
    		System.out.println("T的实际类型是:" +ob.getClass().getName());
    	}
    }
    
    
    /**
     * 使用泛型
     * @author huan
     *
     */
    public class GenDemo {
    	public static void main(String[] args) {
    		//定义泛型类Gen 的一个Integer版本号
    		Gen<Integer> intOb=new Gen<Integer>(88);
    		intOb.showType();
    		int i=intOb.Getob();
    		System.out.println("Value="+i);
    		System.out.println("------------------");
    		
    		//定义泛型类Gen的一个String版本号
    		Gen<String> strOb=new Gen<String>("Hello Gen!");
    		strOb.showType();
    		String s=strOb.Getob();
    		System.out.println("value="+s);
    	}
    }
    </span>

    相应类图:


    从两张类图能够看出,Object+强制转换实现的抽象是被动的,使用泛型事项的抽象是主动的.使用主动替换被动,让封装的代码侵入性更小.


    四.泛型类与泛型方法的差别

    从作用域来说,泛型类的作用域要比泛型方法要小一些.使用泛型类所受到的限制要大一些.

    从载入的情况来看,泛型类推迟了载入时间,属于懒载入.

     

    五.总结

    1.使用泛型,泛型的中的參数是地址传值还是按值传递.

     答案:是地址传值

    2.从复用性的角度来说,泛型类和泛型方法那个更好.gxpt运用的是泛型方法,itoo使用的泛型类.itoo使用泛型类是为了把底层进行进一步的封装.提高代码的复用率.

    3.使用集合的时候都会用上泛型,那么容器是集合+方法,在容器中,泛型也是经常使用的。所以学习容器的时候,应该先理解泛型的思想.



  • 相关阅读:
    欧拉回路 定理
    UESTC 1087 【二分查找】
    POJ 3159 【朴素的差分约束】
    ZOJ 1232 【灵活运用FLOYD】 【图DP】
    POJ 3013 【需要一点点思维...】【乘法分配率】
    POJ 2502 【思维是朴素的最短路 卡输入和建图】
    POJ 2240 【这题貌似可以直接FLOYD 屌丝用SPFA通过枚举找正权值环 顺便学了下map】
    POJ 1860【求解是否存在权值为正的环 屌丝做的第一道权值需要计算的题 想喊一声SPFA万岁】
    POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
    js 实现slider封装
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5129145.html
Copyright © 2011-2022 走看看