標籤:注意 技術 equal 類型 lang oid 通配 擦除 參考型別
泛型
泛型型別的參數類型必須是參考型別
如 ArrayList<int> list = new ArrayList<int>(); //錯誤
ArrayList<Integer> list = new ArrayList<Integer>(); //正確
list.add(5); //正確 自動打包(裝箱)機制
int i = list.get(0); //正確,如果元素是封裝類型,如Integer,Double,Character,可以直接將這個元素賦給一個基本類型的變數。這個過程稱為自動拆箱機制
import java.util.ArrayList;public class GenericStack<E> { private ArrayList<E> list = new ArrayList<E>(); public boolean isEmpty() { return list.isEmpty(); } public int getSize() { return list.size(); } public E peek() { return list.get(getSize() - 1); } public E pop() { E o = list.get(getSize() - 1) ; list.remove(getSize() - 1); return o; }
public void push(E o) {
list.add(o);
}
public String toString() {
return "stack: " + list.toString();
}
}
GenericStack擦除參數類型後的建構函式形式是 GenericStack( ),不是GenericStack<>();
泛型類如果有多個參數類型,則將多個參數放在一個角括弧中,如<E1,E2,E3>。
可以定義類或者介面作為泛型類或者泛型介面的子類型,如Java API中,Java.lang.String類實現Comparable介面的寫法是: public class String implements Comparable<String>;
可以將泛型指定為另外一種類型(或泛型)的子類型,這樣的泛型型別稱之為受限的
public class BoundedTypeDemo{
public static <E extends GeometricObject> boolean equalArea(E object1, E object2 )
{
return object1.getArea() == object2.getArea( );
}
}
注意: 泛型型別放置的位置,應放在方法的傳回型別之前(定義泛型方法)或者類名之後(定義泛型類時)
可以使用泛型的原始類型(Generic)而無需指定具體類型。如:
GenericStack stack = new GenericStack( ); 等價於
GenericStatck<Object> stack = new GenericStack<Object>( );
這種不帶型別參數的GenericStack泛型類稱為原始類型。使用原始類型可以向後相容Java的早期版本。如Comparable類型
三種形式:
? , 非受限通配,等價於 ? extends object
? extends T, 受限通配,表示T或者T的子類
? super T,下限通配,表示T或者T的父類型
java基礎知識 泛型