1. 什么是泛型通配?
当使用泛型类或者泛型接口时候,传递数据过程中,泛型类型不确定
, 则可以通过<?> 来匹配。一旦使用通配符,只能使用Object中共性方法。
2. 使用通配符<?>示例
public class GenericDemo {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
ArrayList<String> list2 = new ArrayList<>();
list2.add("a");
list2.add("b");
// 调用输出函数,分别想打印结果
printArray(list1);
printArray(list2);
}
/*
当传入Integer类型,list2将会报错,当传入String类型,list1将会报错
此时,很多会填入Object泛型,但是对不起,泛型没有继承概念
因此我们使用通配符?
*/
public static void printArray(ArrayList<?> list) {
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
// 注意返回Object对象类型
Object next = iterator.next();
System.out.println(next);
}
}
}
输出结果:
3. 使用受限泛型
/*
泛型的上限限定:? extends E 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定:? super E 代表使用的泛型只能是E类型的父类/本身
*/
public class GenericDemo {
public static void main(String[] args) {
Collection<Integer> list1 = new ArrayList<>();
Collection<String> list2 = new ArrayList<>();
Collection<Number> list3 = new ArrayList<>();
Collection<Object> list4 = new ArrayList<>();
/*
类与类之间的继承关系
Integer extends Number extends Object
String extends Object
*/
getElement1(list1);
getElement1(list2); // 报错,因为getElement1只接受Number本身及其子类
getElement1(list3);
getElement1(list4); // 报错,因为getElement1只接受Number本身及其子类
getElement2(list1); // 报错,因为getElement2只接受Number本身及其父类
getElement2(list2); // 报错,因为getElement2只接受Number本身及其父类
getElement2(list3);
getElement2(list4);
}
// 泛型上限,只接受Number及其子类
public static void getElement1(Collection<? extends Number> coll) {
}
// 泛型下限,只接受Number及其父类
public static void getElement2(Collection<? super Number> coll) {
}
}
4. 再深入研究java源码中出现的知识
链接:复杂泛型源码
来源:CSDN
作者:l8947943
链接:https://blog.csdn.net/l8947943/article/details/104156460