• 谈谈我眼中的泛型


               非常早的时候我就接触了泛型,可是那个时候并不了解泛型有什么优点,在抽象的过程中使用泛型,后来接触到了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.使用集合的时候都会用上泛型,那么容器是集合+方法,在容器中,泛型也是经常使用的。所以学习容器的时候,应该先理解泛型的思想.



  • 相关阅读:
    eclipse工具
    Tag
    JSP模版
    Eclipse断点调试
    JavaBean
    验证码设计
    在IE中提示404错误
    序列化与反序列化
    文件编码问题
    强类型,弱类型和推断类型
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5129145.html
Copyright © 2020-2023  润新知