泛型中? super T和? extends T的区别

1、? extends T

意思是泛型擦除到T,是T类型或其子类型,具体是什么类型不确定,只能存放null,用下面的代码解释

       //放Number及Number的子类具体是Number的哪个子类不确定,所以只具有放null的能力,主要用来读取数据,以下都是合法的赋值方式
         List<? extends Number> foo0 = new ArrayList<Integer>(){
	 		{
	 			this.add(123);
	 			this.add(1234);
	 		}
	 	};
	 	List<? extends Number> foo1 = new ArrayList<Number>(){
	 		{
	 			this.add(123);
	 			this.add(1234);
	 		}
	 	};
	 	List<? extends Number> foo2 = new ArrayList<Double>(){
	 		{
	 			this.add(123d);
	 			this.add(1234d);
	 		}
	 	};
	 	List<? extends Number> foo3 = new ArrayList<Float>(){
	 		{
	 			this.add(123f);
	 			this.add(1234f);
	 		}
	 	};
	 	List<? extends Number> foo4 = new ArrayList<Short>(){
	 		{
	 			this.add(new Short((short)12));
	 			this.add(new Short((short)24));
	 		}
	 	};
foo0.add(123);   //报错,不能放入数据
foo2.add(123d);  //报错,不能放入数据
foo3.add(123f);  //报错,不能放入数据
foo4.add(new Short((short)12))//报错,不能放入数据

只能放入引用类型的默认值null
foo0.add(null);   //正确
foo2.add(null);  //正确
foo3.add(null);  //正确
foo4.add(null)  //正确

2、? super T

意思是泛型擦除到T,是T类型或其超类型,能存放T类型及子类型,用下面的代码解释

//放Number及Number的超类具体是除了Number之外的的哪个超类不确定,擦除到Number,只能存放Number及其子类,多态
	 	List<? super Number> foo5 = new ArrayList<Number>(){
	 		{
	 			this.add(123.0);
	 			this.add(567);
	 			this.add(234);
	 		}
	 		};
	 		foo5.add(new BigDecimal("100.23"));
                        
	 		List<? super Number> foo6 = new ArrayList<Object>(){
	 			{
	 				this.add(123.0);
	 				this.add(567);
	 				this.add(234);
	 			}
	 		};
	 	       //foo1.add(new Object());错误,若能放Object,则根据多态,String类型也能放,不符合泛型规则
	 		foo6.add(new BigDecimal("100.23"));
	 		System.out.println(foo1);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值