函数式编程
通孔维基百科:早期版本的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);