2

我试图弄清楚为什么这段代码无法编译。

我有接口 B 扩展的接口 A。实现接口 B 的类 C。

当我调用一个接受单个 A 类型对象的方法时,我可以传入一个 C 类型的对象,这很好。

当我调用一个接受 A 类型的 java.util.List 的方法时,我无法传入 C 类型的对象的 java.util.List。Eclipse 生成以下错误:Test1 类型中的方法 addAList(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 {
    }
}
4

3 回答 3

14

AList<Car>不是List<Vehicle>. 如果是,您可以执行以下操作:

List<Car> cars = new ArrayList<>();
List<Vehicle> vehicles = cars;
vehicles.add(new Bicycle());

你最终会得到一个包含自行车的汽车列表。它会破坏泛型集合的类型安全。

您可能应该使用 aList<? extends A>而不是List<A>. List<? extends A>意思是:一个List<some class which is A or which extends A>

于 2012-06-28T13:06:44.633 回答
1

它需要 List 并且您正在传递 List,

将其更改为

public void addAList(List<? extends A> aList) {
        return;
}
于 2012-06-28T13:04:24.610 回答
0

它需要 A 类型的 List ....将其写入您的方法签名中。

public void addAList(List<? extends A> aList) {
        return;
    }

通过写这个你声明..你的方法需要任何包含 A 的任何子类型的列表。..这称为通配符。

于 2012-06-28T13:05:35.580 回答