摘自Joshua Bloch的Effective Java,

  • 数组在两个重要方面不同于通用类型。第一数组是协变的。泛型是不变的。
  • 协变量仅表示如果X是Y的子类型,则X []也将是Y []的子类型。数组是协变的,因为字符串是Object的子类型,所以
    String[] is subtype of Object[]
    不变式仅表示X是否为Y的子类型,
     List<X> will not be subType of List<Y>.
    

  • 我的问题是,为什么决定在Java中使数组协变?还有其他SO帖子,例如Why are Arrays invariant, but Lists covariant?,但它们似乎集中在Scala上,我无法关注。

    最佳答案

    通过wikipedia:



    这回答了以下问题:“为什么数组是协变的?”或更准确地说,“为什么数组在当时是协变的?”

    引入泛型后,由于this answer by Jon Skeet中指出的原因,有意使它们无协变:



    Wikipedia文章中描述的使数组协变的原始动机不适用于泛型,因为wildcards使得表达协方差(和相反方差)成为可能,例如:

    boolean equalLists(List<?> l1, List<?> l2);
    void shuffleList(List<?> l);
    

    09-25 20:23