如何将一个 List<Class> 转换为 List<Interface> 以供方法调用?

9
我有一些实现了共同接口的对象。比如说,我有Apple和其他一些实现HasSeed接口并返回其籽数的Fruits
然后,我有一个服务方法,称之为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个回答

22
您必须使用 List<? extends HasSeed>
原因是 List<Apple> 不是 List<HasSeed>的扩展。当您在签名中编写 List<? extends HasSeed> 时,它意味着您接受任何实现 HasSeed 接口的元素列表。这就是为什么您可以将 List<Apple> 作为 List<? extends HasSeed> 传递的原因。

private <T extends HasSeed> List<T> doSomething(List<T> arg)为什么不能正常工作? - user3529850

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接