【Java】泛型通配符
类型通配符
- 类型通配符<?> 一般用于接受使用,不能够做添加
- List<?>:表示元素类型未知的list,它的元素可以匹配任何类型
- 带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中
- 类型通配符上限:<? extend 类型> List <? extends MayiktParent>:它表示的类型是MayiktParent或子类型
- 类型通配符下限:<? super 类型> List <? super MayiktParent>:它表示的类型是MayiktParent或者其父类型
示例代码
package com.collection.Demo06;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
ArrayList<String> arrayListString = new ArrayList<>();
for (int i = 0; i < 5; i++) {
arrayListString.add("i:" + i);
}
ArrayList<Integer> arrayListInteger = new ArrayList<>();
printList(arrayListString);
printList(arrayListInteger);
List<?> arrayList = new ArrayList<>();
// arrayList.add("fsd");//报错,不能添加
}
//参数List类型的泛型,明确String类型
// public static void printList(List<String> stringList){}
/**
* 如果不明确参数List类型的泛型是什么类型,可以使用<?>
* List<?> 只能用于接收,可以接收所有类型的泛型类型,但不能用于添加
*/
public static void printList(List<?> stringList) {
// stringList.add("mayilt");//报错,不能用于添加,∵类型不明确,没法添加
// Object o = stringList.get(0);//不能添加,但可以get,类型是Object
Iterator<?> iterator = stringList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
上限和下限
MayiktParent.java 父类
package com.collection.Demo06;
public class MayiktParent {
}
Student.java 子类
package com.collection.Demo06;
public class Student extends MayiktParent{
}
Test03.java 测试
package com.collection.Demo06;
import java.util.ArrayList;
import java.util.List;
public class Test03 {
public static void main(String[] args) {
List<MayiktParent> mayiktParents = new ArrayList<>();
List<Student> students = new ArrayList<>();
List<Integer> integers = new ArrayList<>();
List<Object> objects = new ArrayList<>();
printList1(mayiktParents);//上限
printList1(students);//上限
// printList1(integers);//报错,∵ integer与MayiktParent没有任何关系
// printList1(objects);//报错,只能是MayiktParent与它的子类
printList2(mayiktParents); //下限
printList2(objects);//下限——父类
// printList2(students);//报错
// printList2(integers);//报错
printList3(mayiktParents);
printList3(students);
printList3(objects);
// printList3(integers);//报错
}
/**
* 问题: List<?> 接收所有类型,如何限制?
* 解决: 类型通配符 上限 和 下限
* 上限: <? extend 类型> List <? extends MayiktParent>:它表示的类型是MayiktParent或子类型
* 下限: <? super 类型> List <? super MayiktParent>:它表示的类型是MayiktParent或者其父类型
*/
//List<? extends MayiktParent> 只能接收MayiktParent 和它的子类
public static void printList1(List<? extends MayiktParent> list) { //上限
}
//List<? super MayiktParent> 只能接收MayiktParent 和它的父类
public static void printList2(List<? super MayiktParent> list) { //下限
}
//如果想是使用super让可以接收mayiktParents和students
public static void printList3(List<? super Student> list) { //下限
}
}
下一篇文章:可变参数