Java 收藏<;?扩展T>;方法
为什么它在第23行抛出编译错误'a'是Apple类的对象,col是一个包含Apple对象的列表,但它仍然抛出下面提到的编译错误: 类型集合中的add(capture#1-of?extends Fruit)方法不适用于参数(Fruit)Java 收藏<;?扩展T>;方法,java,Java,为什么它在第23行抛出编译错误'a'是Apple类的对象,col是一个包含Apple对象的列表,但它仍然抛出下面提到的编译错误: 类型集合中的add(capture#1-of?extends Fruit)方法不适用于参数(Fruit) 公共类篮{ 名单; 公共篮子(){ 列表=新的ArrayList(); } 公共篮子(列表plist){ 列表=plist; } void addFruit(CollectionCollection集合只能包含某些类型及其子类型的条目。例如,如果您有一个集合,它只
公共类篮{
名单;
公共篮子(){
列表=新的ArrayList();
}
公共篮子(列表plist){
列表=plist;
}
void addFruit(CollectionCollection集合只能包含某些类型及其子类型的条目。例如,如果您有一个集合,它只能包含香蕉
尽管香蕉
是水果
的一个子类,集合
与集合
的类型不兼容。这可能看起来有点违反直觉,但可以这样想:在集合
中,你只需要一个香蕉
。你不需要一个苹果
。但是如果你有一个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)