当我们要遍历集合的元素时比如ArrayList,如果有多个集合但是集合的储存类型不同时我们可以定义一个方法完成不同类型集合的遍历
public class Test {
public static void main(String[] args) {
//储存string类型的ArrayList
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
//储存int类型的ArrayList
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
list1.add(2);
list1.add(3);
print(list);
System.out.println("----------");
print(list1);
}
//完成对多个不同的类型ArrayList集合遍历
public static void print(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
这个方法有个" ?" ,该符号是一个占位符,它的意思是传什么类型的ArrayList集合它都可以接受
public static void print(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
为何要用这个“?”?
看例子
public class Test {
public static void main(String[] args) {
//储存string类型的ArrayList
ArrayList<Persons> list = new ArrayList<Persons>();
list.add(new Persons("aaa"));
list.add(new Persons("vvv"));
list.add(new Persons("bbb"));
//储存int类型的ArrayList
ArrayList<Students> list1 = new ArrayList<Students>();
list1.add(new Students("aaa"));
list1.add(new Students("ccc"));
list1.add(new Students("vvv"));
print(list);
System.out.println("----------");
<span style="color:#ff0000;">print(list1);//这里报错,因为无法将储存Persons对象的集合传给储存Students对象的集合</span>
}
//完成对多个不同的类型ArrayList集合遍历
public static void print(ArrayList<Persons> list){
Iterator<Persons> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class Persons {
private String name ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Persons(String name){
this.name = name;
}
}
class Students extends Persons{
public Students(String name) {
super(name);
}
}
所以要使用"?",如果要想把装Persons对象的集合和装Student对象的集合都传给print方法,这里的参数就需要改变
public static void print(ArrayList<<span style="color:#ff0000;">? extends Persons</span>> list){
Iterator<? extends Persons> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next().getName());
}
}
这个用法叫做泛型限定,泛型限定有两种
? extends E 这个是向上限定,这样可以接受E类或者它所有的子类
? super E 这个是向下限定,这样可以接受E类或者它的所有父类