将List <subclass>传递给期望List <superclass> </superclass> </subclass>的方法

时间:2012-02-16 22:02:08

标签: java list generics compiler-errors subclass

我有一个期望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时,我不应该这样做吗?

2 个答案:

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

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

答案 1 :(得分:0)

值得注意的是,你也可以从subClass列表中创建你的superClass列表:

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