协变和逆变的思考

先看协变和逆变的概念
如果某个返回的类型可以由其派生类型替换,那么这个类型就是支持协变的
如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的。

下面展示 例子

	public static void main(String[]args) {
 
		//数组支持协变
 
		Number[] n = new Integer [10];
 
		//编译不通过,泛型不支持协变
 
		List<Number>In =new ArrayList<Integer>();
 
		}
	
}

ArrayList是List的子类型,Integer是Number的子类型,LSP在此处行不通了,原因就是Java为了保证运行期的安全性,必须保证 泛型参数类型是固定的,所以它不允许一个泛型参数可以同时包含两种类型,即使是父子类的关系也不行。
那么如果我们想对泛型使用协变的特性怎么办呢?可以用通配符模拟协变:

List<? extends Number> In = new ArrayList<Integer>();

类似的泛型同样不支持逆变
那么如果我们想对泛型使用逆变的特性怎么办呢?可以用通配符模拟协变:

List<? super Integer> In = new ArrayList<Number>();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值