代码之家  ›  专栏  ›  技术社区  ›  Shubhendu Pramanik

arraylist和arrays.aslist在继承的情况下对集合的工作方式不同

  •  3
  • Shubhendu Pramanik  · 技术社区  · 6 年前
    public class SS {
        public static void main(String[] args) {
            SS s = new SS();
            List<B> list = new ArrayList<>();
    
            s.checkWithoutInheritance(Arrays.asList(new B()));  //Works fine
            s.checkWithoutInheritance(list);    //----------Not working
    
            s.checkWithInheritance(Arrays.asList(new B())); //Works fine
            s.checkWithInheritance(list);   //Works fine
        }
    
        private void checkWithInheritance(final Collection<? extends A> s) {
        }
    
        private void checkWithoutInheritance(final Collection<A> s) {
        }
    }
    
    
    class A {
    };
    
    class B extends A {
    };
    
    3 回复  |  直到 6 年前
        1
  •  1
  •   Oleksandr Pyrohov Andreas    6 年前

    void checkWithoutInheritance(final Collection<A> s);
    

    s.checkWithoutInheritance(Arrays.asList(new B()));
    

    List<A> list = Arrays.asList(new B());
    s.checkWithoutInheritance(list);
    

    List<B> list = new ArrayList<B>();
    s.checkWithoutInheritance(list); // compiler error
    

    are not covariant List<B> 无法分配给 List<A>

    List<B> listb = new ArrayList<B>();
    List<A> lista = listb; // Incompatible types error, even though B extends A
    

    void checkWithInheritance(final Collection<? extends A> s);
    

    <? extends A> wildcard 放宽对变量的限制 s

    s.checkWithInheritance(new ArrayList<A>());
    s.checkWithInheritance(new ArrayList<B>());
    

    <是吗?扩展A> A

        2
  •  3
  •   Eran    6 年前

    List 返回者 Arrays.asList List<A> checkWithoutInheritance()

    s.checkWithoutInheritance(Arrays.asList(new B()));
    

    List<B>

    List<B> list = new ArrayList<>();
    s.checkWithoutInheritance(list);
    

    如果你两个都用

    List<B> list = new ArrayList<>();
    List<B> list2 = Arrays.asList(new B());
    s.checkWithoutInheritance(list2); 
    s.checkWithoutInheritance(list);
    

    两种工作方式:

    s.checkWithoutInheritance(Arrays.asList(new B()));
    s.checkWithoutInheritance(new ArrayList<>());
    

    checkWithInheritance(final Collection<? extends A> s) 列表<A> 这就是为什么你们两个 checkWithInheritance

        3
  •  0
  •   Andy Turner    6 年前
    List<B> list;
    

    B ,的子类 null), to which you can only add things which can be cast to B`。

    private void checkWithoutInheritance(final Collection<A> s) {
    

    A ,只能添加可强制转换的内容 .

    checkWithoutInheritance

    s.add(new A());
    

    checkWithoutInheritance(list);
    

    list A 列表

    不要 s


    private void checkWithInheritance(final Collection<? extends A> s) {
    

    这声明了一个方法,它接受一个作为集合的参数,并保证集合中的所有内容都可以强制转换为 A

    不能添加 A

    s.add(new A()); 在其方法体中,因此可以安全地通过 List<B>