类型通配符
- 类型通配符<?> 一般用于接受使用,不能够做添加
- 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,类型是ObjectIterator<?> 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和studentspublic static void printList3(List<? super Student> list) { //下限}
}
下一篇文章:可变参数