如何传递方法List <interface>而不是List <class>?</class> </interface>

时间:2013-03-18 09:27:00

标签: java oop collections interface

我有一些实现通用接口的对象。假设我有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>)
}

2 个答案:

答案 0 :(得分:9)

您必须使用List<? extends HasSeed>

背后的原因是List<Apple>未延伸List<HasSeed>。在签名中编写List<? extends HasSeed>表示您接受实现HasSeed接口的任何元素列表。这就是为什么您可以将List<Apple>作为List<? extends HasSeed>

传递的原因

答案 1 :(得分:1)

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