码迷,mamicode.com
首页 > 其他好文 > 详细

谈谈我眼中的泛型

时间:2015-03-18 09:02:56      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

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



谈谈我眼中的泛型

标签:

原文地址:http://blog.csdn.net/tang_huan_11/article/details/44396525

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!