与泛型通配符相对应的是泛型限定符,即当需要限定泛型的类型时可以使用限定符。在之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但在很多应用场景,往往要求必须是某一类类型,这时就需要限定泛型的类型。在JAVA中,可以设置泛型的上限和下限。
1.泛型的上限
泛型的上限指的是限定泛型类型的父类,只允许该泛型接收该类型及其子类,使用关键字 extends进行限定,格式为:
类型名称 <? extends 父类 > 对象名称
例如,存在一个读取集合元素的方法:
public static void getElement1(ArrayList <? extends Number> coll){}
该方法对泛型的上限进行了限定,此时泛型中的“?”必须是Number类型或Number类型的子类型,如Integer或Double。
上述代码中,list1是Integer类型的集合、list3是Number类型的集合,符合泛型限定要求,因此getElement(list1)和getElement(list3)能够编译通过,而String和Object不是Number的子类,因此getElement(list2)和getElement(list4)无法通过编译。(www.daowen.com)
2.泛型的下限
泛型的下限指的是限定泛型类型的子类,只允许该泛型接收该类型及其父类,使用关键字 super进行限定,格式为:
类型名称 <? super 子类 > 对象名称
例如,存在一个读取集合元素的方法:
public static void getElement1(ArrayList <? super Number> coll){}
该方法对泛型的下限进行了限定,此时泛型中的“?”必须是Number类型或Number类型的父类型,如Object。
上述代码中,list1是Integer类型的集合,list2是String类型的集合,不符合泛型限定要求,因此getElement(list1)和getElement(list2)无法通过编译。而Object是Number的父类,因此getElement(list3)和getElement(list4)能通过编译。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。