我有一个方法需要一个 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
的实例, B
和 C
.但是,如果您传递 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/