Java子类作为参数

Sim*_*nti 1 java extends subclass

Class A
Class B extends A
Run Code Online (Sandbox Code Playgroud)
public static List<A> doSomething(List<A> items, A item) {
    // manipulate items
    return items;
}
Run Code Online (Sandbox Code Playgroud)
List<B> items = new ArrayList<B>();
B item = new B();

items = doSomething(items, item);
Run Code Online (Sandbox Code Playgroud)

错误:方法doSomething(List <A>,A)不适用于参数(List <B>,B)

项目被接受,但项目不被接受.为什么我不能这样做?

怎样才是正确的方法?

sp0*_*00m 8

你必须使用List<? extends A>.


Joe*_*ckx 5

List<B>不延长List<A>。这是有充分理由的;List<A>非正式地,认为“您可以在其中放入 A 的实例”的合同对于 无效List<B>

您需要表明您愿意接受子类型为 的列表A。您可以使用通配符(如 )来做到这一点List<? extends A>。然而,你的返回类型也会变成List<? extends A>你不想要的。你真正想要的是,如果你传入List<B>,返回类型是List<B>.

要在不进行强制转换的情况下正确执行此操作,您需要绑定类型并指定它可以子类 A。

public static <T extends A> List<T> doSomething(List<T> items, T item) {
    // manipulate items
    return items;
}
Run Code Online (Sandbox Code Playgroud)

这应该有效。