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)
项目被接受,但项目不被接受.为什么我不能这样做?
怎样才是正确的方法?
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)
这应该有效。