JDK1.5新特性一之泛型(Generics)

孤街醉人 提交于 2020-02-29 19:59:17

    有人会疑问,泛型是什么东东? 引用官方的话来说:

    泛型就是:“the type system allows a type or method to operate on objects of various types while providing compile-time type safety. It adds compile-time type safety to the Collections Framework and eliminates the drudgery of casting”。看不明白吗??没关系,下面我就给大家解释一下我的理解(注:是我的理解,如果你表达的更好,欢迎指正~)。

    说白了,jdk中加入了泛型,可以让我们省去类型强制转换的工作,同时加到编译时异常中来;再说白一点,就是你使用了泛型之后,不用再做强制类型转换了,同时如果你的赋值对象不匹配,那么编译器会警告你这里出错了,而不用再等到程序运行时报了一个ClassCastException的时候才发现代码有问题了。不知道我说的这么白白了,你明白了没有,还没有明白,那请往下看....

    比如,之前我们想要在操作集合类中的对象是这样写:   

static void expurgate(Collection c) {
	for (Iterator i = c.iterator(); i.hasNext(); ){
	  if (((String) i.next()).length() == 4){
			i.remove();
		}
	}
}

    看着这么多的括号你头疼了吗??反正我是晕了~来看看使用泛型之后的代码:

static void expurgate(Collection<String> c) {
	for (Iterator<String> i = c.iterator(); i.hasNext(); ){
		if (i.next().length() == 4){
			i.remove();
		}
	}
}

    感觉没有少什么东西,不过清析了很多,没错!这就是泛型的一个简单的应用。可以让我们在从集合中取元素的时候不再做讨厌的强制类型转换,也不用担心我转换的类型是不是集合里面存储的类型,用一个字来形容,啊~~~(擦,不要想多了)。

    其实,只是上面单纯的这些,还不足以让我如此的激动,泛型还可以应用在方法的参数里,那是什么概念?直接上代码:    

/**
 * 参数使用泛型
 */
public static <T> void testParam(T param){
	System.out.println(param);
}
public static void main(String[] args) {
		testParam(2f);
		testParam("test");
		testParam(123);

}  
运行结果: 2.0
         test
         123

    观众朋友们看出什么来了吗??没错,就是我testParam方法的参数使用了一个泛型,那么这样用有什么好处呢?那就是:自己体会去吧~

    其实,只是上面的这些情景,不足以让我如此的激动,泛型还可以用在返回值上(啊??你说什么~~),没错,泛型也可以用在返回值类型上。代码如下: 

/**
 * 返回值使用泛型
 */
public <E extends Comparable<E>>E retunGenerics(E e1, E e2){
	E t = e1;
	if(e2.compareTo(e1) > 0	){
		t = e2;
	}
	return t;
}    

    这时候,你是不是也已经开始暗爽了呢,那你猜我下面要说些什么呢?没错,恭喜你答对了

    其实,只是上面的这些情景,还不足以让我如此的激动。泛型还可以用在类上(oh,shit!),代码如下:

public class GenericsType <T>{

	private T t ;
	
	public GenericsType(T t){
		this.t = t ;
	}
	
	public void printValue(){
		System.out.println(t);
	}
}

    好,这时候如果我调用构造函数进行对象初始化的时候,会有什么不同呢??我写了一下

/**
 * 测试泛型类
 */
@Test
public void testGenericsType(){
	GenericsType<Integer> gt = new GenericsType<Integer>(10);
	gt.printValue();
	GenericsType<String> gt1 = new GenericsType<String>("test");
	gt1.printValue();
}

    想知道结果是什么吗??那你们回去自己试一下吧,如果你对上面的内容已经掌握,我想你已经知道结果了~

    好了,说了这么多,不知道观众朋友们在使用泛型上有没有一点自己的想法啦??如果有好的想法,说出来哈!~

     Thank you ~

            goodbey ..

                    &(#$)#Q&$)(&#)($#W*)@$%^^^^^^****

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!