黑马程序员——泛型限定



当我们要遍历集合的元素时比如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类或者它的所有父类




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值