Java 收藏<;?扩展T>;方法

Java 收藏<;?扩展T>;方法,java,Java,为什么它在第23行抛出编译错误'a'是Apple类的对象,col是一个包含Apple对象的列表,但它仍然抛出下面提到的编译错误: 类型集合中的add(capture#1-of?extends Fruit)方法不适用于参数(Fruit) 公共类篮{ 名单; 公共篮子(){ 列表=新的ArrayList(); } 公共篮子(列表plist){ 列表=plist; } void addFruit(CollectionCollection集合只能包含某些类型及其子类型的条目。例如,如果您有一个集合,它只

为什么它在第23行抛出编译错误'a'是Apple类的对象,col是一个包含Apple对象的列表,但它仍然抛出下面提到的编译错误:

类型集合中的add(capture#1-of?extends Fruit)方法不适用于参数(Fruit)

公共类篮{
名单;
公共篮子(){
列表=新的ArrayList();
}
公共篮子(列表plist){
列表=plist;
}

void addFruit(Collection
Collection集合只能包含某些类型及其子类型的条目。例如,如果您有一个
集合,它只能包含香蕉

尽管
香蕉
水果
的一个子类,
集合
集合
的类型不兼容。这可能看起来有点违反直觉,但可以这样想:在
集合
中,你只需要一个
香蕉
。你不需要一个
苹果
。但是如果你有一个
Co>llection
,您可以在其中放置各种水果。您还可以将任何水果添加到集合中

如果您将
集合
强制转换为
集合
,您可以在其中添加苹果。然后您尝试从
集合
中拉出一个香蕉,您将得到一个苹果。由于您无法将
苹果
强制转换为
香蕉
,因此在运行时会抛出一个
ClassCastException
,您的代码失败


因此,在您的情况下,您可能需要@Eran建议的
集合
。但是,为了详细回答您的问题:如果您有
集合
,您可以将该集合用作
集合它引发了什么编译错误?比在运行时引发
ClassCastException
要好:)收集确实有效,但是,Collection@user2833621不,它的意思不一样。
Collection
public class Basket {
    List<Fruit> list;
    public Basket() {
        list = new ArrayList<>();
    }
    public Basket(List<Fruit> plist) {
        list = plist;
    }

   void addFruit(Collection<? extends Fruit> col) { // this does not work
// void addFruit(Collection<Fruit> col) { // this works
        Fruit a = new Apple();
        Apple a1 = new Apple();
        Fruit f1 = new Fruit();
        col.add(a);// line 23
    }

    int getSize() {
        return list.size();
    }

    public static void main(String[] args) {
        Fruit f1 = new Apple();
        Fruit f2 = new Apple();
        Fruit f3 = new Apple();
        List<Fruit> list = new ArrayList<>();
        list.add(f1);
        list.add(f2);
        list.add(f3);
        Basket b = new Basket(list);
        b.addFruit(list);
        System.out.println(b.getSize());
    }
}

class Fruit {
}

class Apple extends Fruit {
}
void addFruit(Collection<Fruit> col)