1、限制泛型可用類型
在定義泛型類別時,預設可以使用任何的類型來實例化泛型中的類型,但是如果想要限制使用泛型的類別時,只能用某個特定類型或者其子類型才能實例化該類型時,使用extends關鍵字指定這個類型必須是繼承某個類,或者實現某個接口。
如下Code
public class ListGenericFlag {
private T[] flagArray;
public T[] getFlagArray() {
return flagArray;
}
public void setFlagArray(T[] flagArray) {
this.flagArray = flagArray;
}
}
測試:
public static void main(String[] args) {
ListGenericFlag flag1 = new ListGenericFlag();
ListGenericFlag flag2 = new ListGenericFlag();
LinkedList[] likedList = new LinkedList[10];
flag1.setFlagArray(likedList);
ArrayList[] arrayLists = new ArrayList[10];
flag2.setFlagArray(arrayLists);
}
如果出入的是HashMap,就會顯示出錯
2、當沒有指定泛型繼承的類型或接口時,默認使用T extends Object,所有默認情況下任何類型都可以作為參數傳入。
如下圖Code,可以增加任何對象。
3、現在有這樣一個需求,需要實現如下
flag = new GenericFlag()
flag = new GenericFlag
簡單的說,實例化類型持有者時,它必須是實現List的類別或其子類別,要定義這樣一個名詞,可以使用“?”通配子元,并使用“extends”關鍵字限定類型持有者的型態。
實現的Code如下
public class GenericTest {
private T flag;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
public static void main(String[] args) {
//固定語法
GenericTest extends List> g1 = null;
g1 = new GenericTest();
g1 = new GenericTest();
}
}
super為list上面的(用的較少)
GenericTest super List> g2 = null;
g2 = new GenericTest();
4、泛型的繼承
定義了Parent類,里面有泛型T1和T2
public class Parent {
private T1 flag;
private T2 flag2;
public T1 getFlag() {
return flag;
}
public void setFlag(T1 flag) {
this.flag = flag;
}
public T2 getFlag2() {
return flag2;
}
public void setFlag2(T2 flag2) {
this.flag2 = flag2;
}
}
定義了Child類,定義了T3。同時可以訪問父類的T1和T2
public class Child extends Parent {
private T3 flag3;
public T3 getFlag3() {
return flag3;
}
public void setFlag3(T3 flag3) {
this.flag3 = flag3;
}
}
5、泛型接口的繼承
定義一個泛型接口
public interface IParent {
public void setFlag1(T1 flag1);
public void setFlag2(T2 flag2);
public T1 getFlag1();
public T2 getFlag2();
}
定義泛型接口的實現類
public class ChildClass implements IParent {
private T1 flag1;
private T2 flag2;
public void setFlag1(T1 flag1) {
this.flag1 = flag1;
}
public void setFlag2(T2 flag2) {
this.flag2 = flag2;
}
public T1 getFlag1() {
return flag1;
}
public T2 getFlag2() {
return flag2;
}
}