Java泛型 - 通配符? ? extends A 的含义

迷糊笔记 同时被 2 个专栏收录
23 篇文章 0 订阅
65 篇文章 0 订阅

泛型是JDK5.0后加入的新特征,现在是经常用到,所以记录一下。

为什么使用泛型?

  1. 解决元素存储的安全性问题
  2. 解决获取数据元素时,需要类型强制转化的问题

在不使用泛型时:在list中添加的都是Integer类型,而突然添加了一个String类型,下方强制转化时就不知道如何强制转化了

		List list = new ArrayList();
		list.add(89);
		list.add(87);
		list.add(67);
		//1.没有使用泛型,任何Object及其子类的对象都可以添加进来
		list.add(new String("AA"));
		
		for(int i = 0;i < list.size();i++){
			//2.强转为int型时,可能报ClassCastException的异常
			int score = (Integer)list.get(i);
			System.out.println(score);
            }

加入泛型之后:直接定义为Integer类型的,那么在添加过程中加入非Integer类型的都会报错

		List<Integer> list = new ArrayList<Integer>();
		list.add(78);
		list.add(87);
//		list.add("AA");
		
//		for(int i = 0;i < list.size();i++){
//			int score = list.get(i);
//			System.out.println(score);
//		}
		Iterator<Integer> it = list.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}

 通配符的使用  ?

     * 通配符 ?
     * List<A>、List<B>、。。。。都是List<?>的子类
     * 
     * ? extends A :可以存放A及其子类
     * ? super A:可以存放A及其父类

为什么引入通配符?

我们定义了一个Object类型的list,和String类型的list1,如果让  list=list1; 那么是会报错的。

		List<Object> list = null;
		List<String> list1 = new ArrayList<String>();

使用通配符后 ? 即可实现赋值。 

		List<?> list = null;
		List<Object> list1 = new ArrayList<Object>();
		List<String> list2 = new ArrayList<String>();
		list = list1;
		list = list2;

 

还可以对传入类型进行限制:

     * ? extends A :可以存放A及其子类
     * ? super A:可以存放A及其父类

		List<? extends Number> list3 = null;
		List<Integer> list4 = null;
		list3 = list4;
//		list3 = list1;
		List<? super Number> list5 = null;
		list5 = list1;

 

  • 1
    点赞
  • 0
    评论
  • 6
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

天上飞下一毛雪

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值