繁体   English   中英

通过列表 <Subclass> 到方法期望列表 <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> ,则可以添加ABC实例。 但是,如果您将List<B>作为List<? extends A>传递给方法List<? extends A> List<? extends A>参数,编译器不知道是否允许将AC实例添加到该列表(不允许这样做,但是如果您要传递List<A>则可以)。 因此,编译器限制您不要这样做。

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

值得注意的是,您还可以像这样从子类列表中创建超类列表:

myMethod(new ArrayList<SuperClass>(list));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM