泛型继承和通配符
大约 1 分钟
泛型继承和通配符
说明
- 泛型不具备继承性
List<Object>list = new ArrayList<String>();
// 对吗? 错! <?>
:支持任意泛型类型<?extends A>
:支持 A 类以及 A 类的子类,规定了泛型的上限<?super A>
:支持 A 类以及 A 类的父类,不限于直接父类,规定了泛型的下限
案例
package commonGenericity;
import com.hspedu.poly.detail_.AA;
import java.util.ArrayList;
import java.util.List;
import java.util.function.IntToDoubleFunction;
public class customGenerics {
public static void main(String[] args) {
List<Object> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<CC> list3 = new ArrayList<>();
List<DD> list4 = new ArrayList<>();
List<EE> list5 = new ArrayList<>();
// 如果是 List<?>c ,可以接受任意的泛型类型
printCollection1(list1);
printCollection1(list2);
printCollection1(list3);
printCollection1(list4);
printCollection1(list5);
// List<? extends CC> c:可以接受 CC 或者 CC 子类
// printCollection2(list1); // 错
// printCollection2(list2); // 错
printCollection2(list3); // 对
printCollection2(list4); // 对
printCollection2(list5); // 对
// List<? super CC> c: 支持 CC 类以及 CC 类的父类,不限于直接父类:
printCollection3(list1); // 对
// printCollection3(list2); // 错
printCollection3(list3); // 对
// printCollection3(list4); // 错
// printCollection3(list5); // 错
}
/**
* 泛型继承和通配符
* List<?> 表示 任意的泛型类型都可以接受
*/
public static void printCollection1(List<?> c) {
for(Object object : c){ // 通配符,取出时,就是 Object
System.out.println("printCollection1 方法");
System.out.println(object);
}
}
// ? extends CC 表示 上限,可以接受 CC 或者 CC 子类
public static void printCollection2(List<? extends CC> c) {
for (Object object : c) {
System.out.println("printCollection2 方法");
System.out.println(object);
}
}
// ? super 子类类名 CC: 支持 CC 类以及 CC 类的父类,不限于直接父类:
// 规定了泛型的下限
public static void printCollection3(List<? super CC> c){
for(Object object : c) {
System.out.println(object);
}
}
}
class CC {}
class DD extends CC {}
class EE extends DD {}