【问题标题】:How to pass a method a List<Interface> instead of List<Class>?如何将方法传递给 List<Interface> 而不是 List<Class>?
【发布时间】:2013-03-18 09:27:00
【问题描述】:

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

然后我有一个服务方法,在这里称之为FruitProcessor,带有一个addAll(List&lt;HasSeed&gt;) 类。我想我可以传入一个实现HasSeed接口的对象列表,比如一个苹果列表。

但我不能,编译器抱怨它不适用于参数。 还有一件事:我无法将List&lt;Apple&gt; 更改为List&lt;HasSeed&gt;。但是我需要一个可以在我的 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>)
}

【问题讨论】:

    标签: java oop collections interface


    【解决方案1】:

    你必须使用List&lt;? extends HasSeed&gt;

    背后的原因是List&lt;Apple&gt; 没有扩展List&lt;HasSeed&gt;。当您在签名中写上List&lt;? extends HasSeed&gt; 时,这意味着您接受任何实现HasSeed 接口的元素列表。这就是为什么您可以将List&lt;Apple&gt; 作为List&lt;? extends HasSeed&gt; 传递的原因

    【讨论】:

    • private &lt;T extends HasSeed&gt; List&lt;T&gt; doSomething(List&lt;T&gt; arg) 呢?为什么它不起作用?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2019-12-29
      • 2016-07-07
      相关资源
      最近更新 更多