我正在试图找出为什么这段代码无法编译。
我有接口A扩展了接口B. 实现接口B的C类。
当我调用一个接收A类单个对象的方法时,我可以传入一个C类型的对象,这很好。
当我调用一个接受类型为A的java.util.List的方法时,我无法传入类型为C的对象的java.util.List.Eclipse会生成以下错误: Test1类型中的方法addAList(List)不适用于参数(List)
源代码示例如下。
import java.util.ArrayList;
import java.util.List;
public class Test1 {
public void addASingle(A a) {
return;
}
public void addAList(List<A> aList) {
return;
}
// **********************************
public static void main(String[] args) {
Test1 t = new Test1();
C c1 = new C();
List<C> cList = new ArrayList<C>();
cList.add(c1);
t.addASingle(c1); // allowed
t.addAList(cList); // The method addAList(List<Test1.A>)
// in the type Test1 is not applicable for the arguments (List<Test1.C>)
}
// **********************************
public static interface A {
}
public static interface B extends A {
}
public static class C implements B {
}
}
答案 0 :(得分:14)
List<Car>
不是List<Vehicle>
。如果是,您可以执行以下操作:
List<Car> cars = new ArrayList<>();
List<Vehicle> vehicles = cars;
vehicles.add(new Bicycle());
你会得到一个包含自行车的汽车列表。它会破坏通用集合的类型安全性。
您可能应该使用List<? extends A>
代替List<A>
。 List<? extends A>
表示:List<some class which is A or which extends A>
。
答案 1 :(得分:1)
它需要List并且您正在传递List,
将其更改为
public void addAList(List<? extends A> aList) {
return;
}
答案 2 :(得分:0)
它需要A类型的List ....将它写在方法签名中。
public void addAList(List<? extends A> aList) {
return;
}
通过编写本文,您声明...您的方法需要任何包含A的任何子类型的List。 ..这称为通配符。