我有一个期望List<SuperClass>
作为参数的方法:
public void myMethod(List<SuperClass> list) {}
我想用List<Subclass>
这样的方法调用该方法:
List<SubClass> subList = new ArrayList<>();
// ...
myMethod(subList); // Got an argument mismatch error on this line.
SubClass extends SuperClass
时,我不应该这样做吗?
答案 0 :(得分:20)
不,仿制药不能那样工作。你可以做的是将你的方法定义为MyMethod(List<? extends SuperClass> list)
(按照惯例,它应该被命名为myMethod(...)
顺便说一句。
List<SuperClass>
与List<SubClass>
的问题在于您可以向此类列表添加新元素,而编译器不允许您向List<? extends SuperClass>
添加内容 - 这样做原因:
请考虑以下事项:
class A {}
class B extends A {}
class C extends A {}
如果您现在有List<A>
,则可以添加A
,B
和C
的实例。但是,如果将List<B>
作为List<? extends A>
参数传递给方法,则编译器不知道是否允许将A
或C
的实例添加到该参数列表(不允许这样做,但是如果你传递List<A>
那就是)。因此,编译器限制您不要这样做。
将参数定义为List<A>
告诉编译器可以将所有三个类的实例放到该列表中。现在,如果您允许传递List<B>
作为此类参数,则最终会得到包含List<B>
和/或A
实例的C
。这显然不是你想要的,并且可能导致运行时错误,应该在编译时阻止 - 通过使用泛型。这就是为什么你的方法不起作用的原因。
答案 1 :(得分:0)
值得注意的是,你也可以从subClass列表中创建你的superClass列表:
myMethod(new ArrayList<SuperClass>(list));