泛型類(lèi)或方法允許用戶(hù)指定可以和這些類(lèi)或方法一起工作的對(duì)象類(lèi)型(相容的對(duì)象)
泛型類(lèi)ArrayList、泛型接口Comparable
從JDK1.5開(kāi)始,Java允許定義泛型類(lèi)、泛型接口、泛型方法
泛型就是限制對(duì)象的數(shù)據(jù)類(lèi)型
創(chuàng)建一個(gè)存儲(chǔ)字符串的線性表(ArrayList)
ArrayList list = new ArrayList<>();
現(xiàn)在就只能向該線性表中添加字符串
list.add("a");
如果試圖向其中添加非字符串類(lèi)型,就會(huì)產(chǎn)生編譯錯(cuò)誤
list.add(new Person("張三",23));
當(dāng)沒(méi)有使用泛型時(shí),編譯通過(guò),運(yùn)行也通過(guò),即可以添加任何元素,但這樣做在遍歷元素進(jìn)行相關(guān)操作時(shí)會(huì)產(chǎn)生隱藏的bug。
泛型類(lèi)型必須是引用數(shù)據(jù)類(lèi)型,不能使用基本數(shù)據(jù)類(lèi)型。
ArrayList list = new ArrayList<>();
ArrayList list = new ArrayList<>();
list.add(5); //自動(dòng)裝箱
使用泛型對(duì)數(shù)據(jù)類(lèi)型進(jìn)行限制后,無(wú)須類(lèi)型轉(zhuǎn)換就可以從一個(gè)線性表中獲取一個(gè)值,因?yàn)榫幾g器已經(jīng)知道了這個(gè)元素的類(lèi)型。
ArrayList list = new ArrayList();
list.add("Jone"); //自動(dòng)提升為Object類(lèi)型
list.add("Smith");
String s = (String)(list.get(0));//將Object類(lèi)型轉(zhuǎn)為String類(lèi)型
ArrayList list = new ArrayList<>();
list.add(5.5); //5.5 is automatically converted to new Double(5.5)
list.add(3.0); //3.0 is automatically converted to new Double(3.0)
Double doubleObject = list.get(0); //No casting is needing
double d = list.get(1); //Automatically converted to double
可以為類(lèi)或者接口定義泛型。當(dāng)使用容器類(lèi)來(lái)創(chuàng)建對(duì)象,或者使用容器類(lèi)或接口來(lái)聲明引用變量時(shí),必須指定具體的類(lèi)型。
public class Stack{
//構(gòu)造方法
public Stack(){}
//創(chuàng)建數(shù)組列表,存儲(chǔ)元素的數(shù)據(jù)類(lèi)型為E,需導(dǎo)包alt+shift+O
private ArrayList list = new ArrayList<>();
//返回棧中的元素?cái)?shù)目
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;
}
//添加一個(gè)新元素到棧頂
public void push(E o){
list.add(o);
}
//如果棧為空,就返回true
public boolean isEmpty(){
return list.isEmpty();
}
@Override
public String toString(){
return "stack : " + list.toString();
}
}
若使用LinkedList模擬堆棧結(jié)構(gòu),可以用getLast()、removeLast()、addLast()方法
上面自定義類(lèi)的構(gòu)造方法不是public Stack
泛型可能會(huì)有多個(gè)參數(shù),應(yīng)將所有參數(shù)一起放在尖括號(hào)中,并用逗號(hào)分隔開(kāi),比如
可以定義一個(gè)類(lèi)或接口作為泛型類(lèi)或者泛型接口的子類(lèi)型
例如
public final class String
extends Object
implements Serializable, Comparable, CharSequence
可以為靜態(tài)方法定義泛型類(lèi)型
public clas GenericMethodDemo{
public static void main(String[] args){
Integer[] integers = {1,2,3,4,5};
String[] strings = {"London","Paris","New York","Austin"};
GenericMethodDemo.print(integers);
GenericMethodDemo.print(strings);
}
public static void print(E[] list){
for(int i = 0;i
為了聲明泛型方法,將泛型類(lèi)型
public static void print(E[] list)
為了調(diào)用泛型方法,需要將實(shí)際類(lèi)型放在尖括號(hào)內(nèi)作為方法名的前綴。例如,
GenericMethodDemo.print(integers);
GenericMethodDemo.print(strings);
簡(jiǎn)單調(diào)用
print(integers);
print(strings);
可以將泛型指定為另外一種類(lèi)型的子類(lèi)型,這樣的泛型類(lèi)型稱(chēng)為受限的。例如下面所示的代碼用以測(cè)試兩個(gè)幾何對(duì)象是否具有相同的面積。受限的泛型類(lèi)型將E指定為GeometricObject的泛型子類(lèi)型。此時(shí)必須傳遞兩個(gè)GeomericObject的實(shí)例來(lái)調(diào)用equalArea
public class BoundedTypeDemo{
public static void main(String[] args){
Rectangle rectangle = new Rectangle(2,2);
Circle circle = new Circle(2);
System.out.println("Same area?" + equalArea(rectangle,circle));
}
public static boolean equalArea(
E object1,E object2){
return object1.getArea()==object2.getArea();
}
}
非受限泛型類(lèi)型
為了定義一個(gè)類(lèi)為泛型類(lèi)型,需要將泛型類(lèi)型放在類(lèi)名之后,例如,GenericStack
為了定義一個(gè)方法為泛型類(lèi)型,要將泛型類(lèi)型放在方法返回類(lèi)型之前,例如,void max(E o1,E o2)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。