![](/img/trans.png)
[英]Passing ArrayList<Subclass> to method declared with List<Superclass>
[英]Passing List<Subclass> to method expecting List<SuperClass>
我有一个方法,希望使用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
时,我不能这样做吗?
不,泛型不能那样工作。 您可以做的是将您的方法定义为MyMethod(List<? extends SuperClass> list)
(按照惯例,它应命名为myMethod(...)
btw))。
List<SuperClass>
与List<SubClass>
的问题在于您可以向此类列表添加新元素,而编译器不允许您向List<? extends SuperClass>
添加某些内容List<? extends SuperClass>
List<? extends SuperClass>
-这是有原因的:
考虑以下:
class A {}
class B extends A {}
class C extends A {}
如果现在有了List<A>
,则可以添加A
, B
和C
实例。 但是,如果您将List<B>
作为List<? extends A>
传递给方法List<? extends A>
List<? extends A>
参数,编译器不知道是否允许将A
或C
实例添加到该列表(不允许这样做,但是如果您要传递List<A>
则可以)。 因此,编译器限制您不要这样做。
将参数定义为List<A>
告诉编译器可以将所有三个类的实例放入该列表。 现在,如果允许您传递List<B>
作为这样的参数,您可能会以包含A
和/或C
实例的List<B>
结尾。 而且这显然不是您想要的,并且可能会导致运行时错误,应在编译时通过使用泛型来避免这些错误。 这就是为什么您的方法行不通的原因。
值得注意的是,您还可以像这样从子类列表中创建超类列表:
myMethod(new ArrayList<SuperClass>(list));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.