java泛型作用與使用

List list = new ArrayList();
list.add("vince"); 
list.add(10);
listadd(new Person();
listadd(obj);
List中可以添加任意類型,因爲參數是0bject, 這樣一個我們在遍歷這個集合時:
for(int i=(istsizi(;++{I
//此處需要判斷元素的類型,才能執行不同的操作

以上操作主要存在兩個問題:

1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型依然爲其本身類型。

2.因此,//1處取出集合元素時需要人爲的強制類型轉化到具體的目標類型,且很容易出現"java.lang.ClassCastException"異常。
那麼有沒有什麼辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現"java.lang.ClassCastException"異常呢?
答案就是使用泛型

什麼是泛型

JDK 1.5之後出現了新的技術- - -泛型(Generic) ,此技術的最大特點是類中的屬性的類型可以由外部決定。泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。

List<String> list = new ArrayList<String>/(;//.. = new ArrayList<>(); /... = new ArrayList();
list.add("vince");
list.add("bin");
/litadd(100); // 提示編譯錯誤
for (inti= 0;i< list.size(); i++){
String name = list.get(i); // 2
System.out.printIn("name:" + name);

泛型類和方法定義:

class Node<T>{
private T data;
public Node(){}
public Node(T data){
this.data= data;
}
public T getData(){
return data;
}
public void setData(T data) {
this.data = data;
}
}
interface shoppingT>{public volid shopping(T name);} 

在泛型接口、泛型類和泛型方法的定義過程中,我們常見的如、E、K、 v等形式的參數常用於表示泛型形參,由於接收來自外部使用時候傳入的類型實參,從編碼的角度也稱爲參數化類型了。
泛型只是作用於代碼編譯階段,在編譯過程中,對於正確檢驗泛型結果後,會將泛型的相關信息擦出,也就是說,成功編譯過後的class文件中是不包含任何泛型信息的。泛型信息不會進入到運行時階段。

通配符:

問題:

Node<Number> c1 = new Node<Number>();
Node<Integer> c2 = new Node<Integer>() ;
c1 = c2;//此時無法轉換
public static void getData(Node<Number> data) {
System. out.println("data :" + data.getData);
}

此時,我們可以使用通配符來解決
“?”表示的是可以接收任意的泛型類型,但是隻是接收輸出,並不能修改。

public static void getData(Node<?> data) {
System.out.printIn("data :" + data.getDatal();
}

泛型上限就指-一個的操作泛型最大的操作父類,例如,現在最大的上限設置成“Number”類型,那麼此時,所能
夠接收到的類型只能是Number及其子類(Integer) 。

泛型的上限通過以下的語法完成:
? extends類

public static void getUpperNumberData(Node<? extends Number> data){ //只能是Number類及其 子類
System.out.println(" data :" + data.getData();
}

泛型的下限指的是隻能設置其具體的類或者父類。設置的語法如下:
? super類

泛型方法:
泛型除了在類中定義之外,還可以在方法上定義,而且在方法上使用泛型,此方法所在的類不一定是泛 型的操作類。

定義一個方法,實現任意類型數組中兩個位置值的調換

public static <T> T[] func(T[] array,int i,int t){
T temp = array[i];
array[i]= array[t]; 
array[t] = temp;
return array;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章