4

我有一些实现通用接口的对象。假设我Apple和其他一些Fruits实施HasSeed并返回他们的种子数量的人。

然后我有一个服务方法,在这里调用它FruitProcessor,带有一个addAll(List<HasSeed>)类。我想我可以传入一个实现HasSeed接口的对象列表,比如一个苹果列表。

但我不能,编译器抱怨它不适用于参数。还有一件事:我无法List<Apple>List<HasSeed>. 但是我需要一个可以在我的 FruitProcessor 中获取任何对象列表的方法,然后getSeeds()无论它是什么对象都可以调用。

我该如何适应以下内容?

class Fruit {};
class Apple extends Fruit implements HasSeed {
   @Override
   int getSeeds() {
       return 5; //just an example
   }
}

class FruitProcessor {
    static void addAll(List<HasSeed> list) {
        for (HasSeed seed : list) {
            Sysout("the fruit added contained seeds: " + list.getSeeds());
        }
    }
}

class FruitStore {
    List<Apple> apples;
    FruitProcessor.addAll(apples); //The method addAll(List<HasSeed>) in the type FruitProcessor is not applicable for the arguments (List<Apple>)
}
4

2 回答 2

15

你必须使用List<? extends HasSeed>

背后的原因是它List<Apple>不扩展List<HasSeed>。当您List<? extends HasSeed>在签名中写入时,这意味着您接受任何实现该HasSeed接口的元素列表。这就是为什么你可以List<Apple>通过List<? extends HasSeed>

于 2013-03-18T09:29:41.983 回答
1

使用static void addAll(List<? extends HasSeed> list),因为您将列表声明为 aList<Apple>而不是List<HasSeed>

于 2013-03-18T09:30:51.343 回答