java - ArrayList 和 Arrays.asList 在继承情况下对 Collection 的工作方式不同

标签 java generics inheritance collections

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 {
};

最佳答案

它们的行为并没有不同,只是您以不同的方式使用它们。

这里您让编译器决定 List 的类型由 Arrays.asList 返回, 编译器决定它应该是 List<A> ,给定 checkWithoutInheritance() 所需的参数:

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

在这里你传递了一个 List<B>方法,因此编译器别无选择,只能失败:

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

如果您同时使用 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) , 它接受 List<A>和一个 List<B> ,这就是为什么你的 checkWithInheritance调用通过编译。

关于java - ArrayList 和 Arrays.asList 在继承情况下对 Collection 的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51059482/

相关文章:

java - Android Studio 方法 gettext 必须从 ui 线程调用,当前推断线程是工作线程

java - 如何构建多层测试对象?

java - 从抽象类构建单例

delphi - 如何将 TObjectList 用于任意类类型?

java - 如何从子类调用重写的父类方法?

java - Android OpenGL 获取渲染结果为 Java Byte 数组

java - HtmlUnit - 将 HtmlPage 转换为 HTML 字符串?

Java 泛型命名约定

c# - 无法将带有 [] 的索引应用于类型为“System.Collections.Generic.IEnumerable<>”的表达式

java - 如何将泛型应用于不使用类的类型参数的方法