java - 将 List<Subclass> 传递给需要 List<SuperClass> 的方法

标签 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 时执行此操作吗? ?

最佳答案

不,泛型不是那样工作的。你可以做的是将你的方法定义为 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 的实例, BC .但是,如果您传递 List<B>作为 List<? extends A> 的方法参数,编译器不知道是否允许添加 A 的实例或 C到那个列表(这是不允许的,但如果你传递了一个 List<A> 它会是)。因此编译器限制你不要这样做。

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

关于java - 将 List<Subclass> 传递给需要 List<SuperClass> 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9319758/

相关文章:

java - `class <T extends A> { }` 和使用 A 的 `class { }` 之间的实际区别是什么?

java - 当使用额外条件运行分页查询时,Hibernate Mapping 返回多个相同的对象

java - 计算给出不同的结果

java - Java 中的二进制搜索 - 学习它 "my way"

list - 列表 ECLiPSe clp 上的简单算术约束

list - Scala groupby 元素类型

java - 如何使 JFrame 透明?

python - 是否有与 Ruby 的 'any?' 函数等效的 Python?

delphi - 在 Delphi 中使用泛型与属性接口(interface)

java - Java 中破坏逆变边界的安全解决方法?