——JDK1.5新特性之泛型

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

泛型:

    JDK1.5版本以後出現的新特性,用於解決安全問題,是一個安全機制。

    好處:

1,將運行期,出現的問題ClassCastException,轉移到了編譯時期。

  方便與程序員解決問題,讓運行時問題減少,保證安全。

2,避免了自動裝箱和拆箱的操作。避免了拆箱的安全問題。

    泛型格式:通過<> (意思:type of)來定義要操作的引用數據類型。

在使用java通過的對象時,什麼時候使用泛型 

通常在集合框架中很常見,只要見到<>就要定義泛型。

其實<>就是用來接收類型的。

當使用集合時,將集合中要存儲的數據類型,作爲參數傳遞到<>中即可。

    如何定義泛型:

1,用<T>,也可以使用佔位符?。

  相同:都可以達到泛型的目的。

  不同:<T>可以在函數內部接收參數對象,進行操作。

?可以設置泛型的上限和下限。
    泛型限定:

1,使用佔位符?來實現;

2,泛型上限:? extends E :即泛型必須是E類型或是其子類

3,泛型下限:? super E:即泛型必須是E型類或是其父類。

    什麼時候使用泛型呢?

當類中要操作的引用數據類型不確定時,句要用到泛型。

JDK1.5之前是用Object來擴展,JDK1.5之後定義泛型來完成擴展。

     泛型使用的地方:

1,泛型類:

                   定義的泛型,在整個類中有效。如果被方法使用,

  那麼泛型類的對象明確要操作的具體類型後,所有要操作的類型就已經固定了。

  class GenericClass<T>{

public void show(T t){

System.out.println(t);

}

  }

2,泛型方法:

    爲了讓不同方法可以操作不同類型,而且類型還不確定,

           那麼就將泛型定義在方法上。<>定義時,要緊挨在返回值類型前!

  語法如下:

訪問修飾符 <T> 返回值類型 方法名(參數<T>列表 )
{

//方法體

}
如:

  public <T> void show(List<T> list){

System.out.println(list);
  }

     

   注:靜態方法不可以類上定義的泛型,如果靜態方法操作的引用數據類型不確定。

可以將泛型定義在方法上。

訪問修飾符 static <T> 返回值類型 方法名(參數<T>列表 )

{

//方法體

}

如:

  public static <T> void show(List<T> list){

System.out.println(list);

  }

3,泛型接口:

                在定義接口的時候,就定義泛型,定義的方式和泛型類類似。



綜合示例代碼:

package com.itheima.generic;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 泛型類,即泛型方法,泛型接口的測試類
 * @author wuyong
 *
 */
public class GenericClass {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//實例化泛型類的對象
		MyGenericClass mgc = new MyGenericClass();
		mgc.setType("abc");
		System.out.println(mgc.getType());
		
		//調用泛型類中的泛型方法
		mgc.getMethodT(4);
		
		//調用泛型類中的靜態泛型方法
		MyGenericClass.staticShow(3.14);
		
		//定義明確操作類型的泛型接口的實現類的實例對象
		GenericFace gFace = new ImplFace1();
		gFace.show("haha");
		
		//定義沒有在實現時沒有明確操作類型的泛型接口的實現類的實例
		GenericFace gFace2 = new ImplFace2();
		gFace2.show(123);
		
		
		//用佔位符?定義的通用方法。用於輸出各種類型的集合的元素。
		System.out.println("==============輸出String=============");
		List strs = new ArrayList();
		strs.add("abc");
		strs.add("123");
		strs.add("哈哈");
		MyGenericClass.genericIterator(strs);
		
		System.out.println("==============輸出Integer=============");
		List strs2 = new ArrayList();
		strs2.add(123);
		strs2.add(21);
		strs2.add(345);
		MyGenericClass.genericIterator(strs2);
	}

}
/**
 * 自定義泛型類
 * @author wuyong
 *
 * @param 
 */
class MyGenericClass{
	private T t;
	public void setType(T t) {
		this.t = t;
	}
	public T getType(){
		return this.t;
	}
	
	/**
	 * 自定義的靜態泛型方法。
	 * 注:此處的是新聲明的。與泛型類匯中的不一樣。
	 *    靜態方法不能訪問泛型類上的,因爲泛型類是的是實例化時,才明確的,而靜態方法則在類第一次加載時就存在了。
	 * @param t
	 */
	public static  void staticShow(W w) {
		System.out.println("靜態泛型方法staticMethod的T:" + w);
	}
	
	/**
	 * 自定義的泛型方法
	 * @param q
	 */
	public  void getMethodT(Q q) {
		System.out.println("泛型方法getMethodT:" + q);
	}
	
	/**
	 * 定義的輸出任意類型的集合元素的通用方法
	 */
	public static void genericIterator(Collection<? extends Object> col) {
		for (Object obj : col) {
			System.out.println(obj);
		}
	}
}

/**
 * 自定義泛型接口
 * @author wuyong
 *
 * @param 
 */
interface GenericFace{
	void show(T t);
}

/**
 * 方式一,實現類在實現泛型接口時,就明確了操作的類型
 * @author wuyong
 *
 */
class ImplFace1 implements GenericFace{
	public void show(String s){
		System.out.println("明確操作類型的泛型接口實現類的show方法:" + s);
	}
}
/**
 * 方式二,實現類在實現泛型接口時,也沒有明確操作的類型
 * @author wuyong
 *
 */
class ImplFace2 implements GenericFace{
	public void show(T s){
		System.out.println("沒有明確操作類型的泛型接口實現類的show方法:" + s);
	}
}


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

發佈了25 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章