将List <Subclass>传递给期望List <SuperClass>的方法

Der*_*rek 9 java generics compiler-errors list subclass

我有一个期望List<SuperClass>as参数的方法:

public void myMethod(List<SuperClass> list) {}
Run Code Online (Sandbox Code Playgroud)

我想用这样的方法调用该方法List<Subclass>:

List<SubClass> subList = new ArrayList<>();
// ...
myMethod(subList); // Got an argument mismatch error on this line.
Run Code Online (Sandbox Code Playgroud)

我不应该这样做SubClass extends SuperClass吗?

Tho*_*mas 20

不,仿制药不能那样工作.你可以做的是将你的方法定义为MyMethod(List<? extends SuperClass> list)(按惯例,它应该命名为myMethod(...)btw).

List<SuperClass>vs 的问题List<SubClass>是你可以向这些列表添加新元素,而编译器不允许你添加一些东西List<? extends SuperClass>- 这有一个原因:

考虑以下:

class A {}

class B extends A {}

class C extends A {}
Run Code Online (Sandbox Code Playgroud)

如果你现在有一个List<A>你可以添加的情况下A,BC.但是,如果传递List<B>到作为一个方法List<? extends A>参数,编译器不知道它是否被允许的情况下添加AC到该列表(它不会被允许的,但如果你想传递一个List<A>它会).因此编译器限制您不要这样做.

定义一个参数,List<A>告诉编译器可以将所有三个类的实例放到该列表中.现在,如果允许您传递一个List<B>这样的参数,最终可能会List<B>包含一个包含A和/或实例的实例C.这显然不是你想要的,并且可能导致运行时错误,应该在编译时防止 - 通过使用泛型.这就是为什么你的方法不起作用的原因.