泛型不是协变的java,为什么数组是协变的,但是泛型是不变的?

260358b7047bd20e9cb531cacf2f9d83.png

函数式编程

通孔维基百科:早期版本的Java和C#不包括泛型(a.k.a)。参数多态性)在这种情况下,使数组不变排除有用的多态程序。例如,考虑编写一个函数来洗牌数组,或者编写一个函数来测试两个数组是否相等,使用Object.equals方法处理元素。实现不依赖于存储在数组中的元素的确切类型,因此应该可以编写适用于所有类型数组的单个函数。很容易实现类型的函数。boolean equalArrays (Object[] a1, Object[] a2);void shuffleArray(Object[] a);但是,如果数组类型被视为不变量,则只能在类型的数组上调用这些函数。Object[]..例如,一个人不能洗牌一个字符串数组。因此,Java和C#共同对待数组类型。例如,在C#中string[]是object[],在Java中String[]是Object[].这回答了一个问题:“为什么数组是协变的?”,或者更准确地说,“为什么?”都是阵列共变当时?"当引入泛型时,由于以下原因,它们是故意不作协变的。这是乔恩·斯基特的回答:不,一个List不是List..考虑一下您可以用List-你可以给它添加任何动物.包括一只猫。现在,你能合理地给一窝小狗加一只猫吗?绝对不是。// Illegal code - because otherwise life would be BadList dogs = new List();List animals = dogs;

 // Awooga awoogaanimals.add(new Cat());Dog dog = dogs.get(0); // This should be safe, right?突然你有了一个非常迷糊的猫。维基百科文章中描述的数组协变的最初动机并不适用于泛型,因为通配符使协方差(和反向方差)的表达成为可能,例如:boolean equalLists(List> l1, List> l2);void shuffleList(List> l);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值