---------------------- <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>、期待與您交流! ----------------------