Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承及;与集合相关的编译错误_Java_Inheritance_Collections_Interface - Fatal编程技术网

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

Java 继承及;与集合相关的编译错误,java,inheritance,collections,interface,Java,Inheritance,Collections,Interface,我试图弄明白为什么这段代码无法编译 我用接口B扩展了接口A。 实现接口B的类C 当我调用一个只接收一个a类型对象的方法时,我可以传入一个C类型的对象,这很好 当我调用接受类型a的java.util.List的方法时,我无法传入类型C的对象的java.util.List。Eclipse生成以下错误: Test1类型中的方法AddList(列表)不适用于参数(列表) 下面是源代码示例 import java.util.ArrayList; import java.util.List; public

我试图弄明白为什么这段代码无法编译

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

当我调用一个只接收一个a类型对象的方法时,我可以传入一个C类型的对象,这很好

当我调用接受类型a的java.util.List的方法时,我无法传入类型C的对象的java.util.List。Eclipse生成以下错误: Test1类型中的方法AddList(列表)不适用于参数(列表)

下面是源代码示例

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 {
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类Test1{
公共无效添加单个(A){
返回;
}
公共无效添加列表(列表列表列表){
返回;
}
// **********************************
公共静态void main(字符串[]args){
test1t=newtest1();
C c1=新的C();
List cList=new ArrayList();
cList.add(c1);
t、 添加单个(c1);//允许
t、 addAList(cList);//方法addAList(List)
//在类型中,Test1不适用于参数(列表)
}
// **********************************
公共静态接口A{
}
公共静态接口B扩展了{
}
公共静态类C实现了B{
}
}

它需要列表,而您正在传递列表

换成

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

public void addAList(List它需要类型为A的列表…。将其写入方法签名中

public void addAList(List<? extends A> aList) {
        return;
    }
public void addlist(ListA
List
不是
List
。如果是,您可以执行以下操作:

List<Car> cars = new ArrayList<>();
List<Vehicle> vehicles = cars;
vehicles.add(new Bicycle());
List cars=new ArrayList();
列出车辆=汽车;
车辆。添加(新自行车());
你最终会得到一个包含自行车的汽车列表,这会破坏通用系列的类型安全性


您可能应该使用一个
列表可能重复的Will do…它告诉我必须再等一分钟!感谢您的及时回答:)@JB Nizet cList.add(c1);在这里,我们将C类型对象分配到一个类型中,它由于继承而起作用…理解得很好…但这种继承在列表的情况下不起作用…为什么?因为,正如我在回答中所说,
List
不会扩展
List
,即使Car扩展了Vehicle。