继承与集合相关的编译错误

时间:2012-06-28 13:02:49

标签: java inheritance collections interface

我正在试图找出为什么这段代码无法编译。

我有接口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 {
    }
}

3 个答案:

答案 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。 ..这称为通配符。