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;
}
}