4

共通のインターフェイスを実装するオブジェクトがいくつかあります。シードの数を実装して返すAppleものがあるとしましょう。FruitsHasSeed

次に、クラスFruitProcessorを使用してサービス メソッドをここで呼び出します。次に、リンゴのリストのように、インターフェイスaddAll(List<HasSeed>)を実装するオブジェクトのリストを渡すことができると考えました。HasSeed

しかし、それはできず、コンパイラーは引数に適用できないと不平を言います。もう 1 つ: を に変更することはできませ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

リストを a and notstatic void addAll(List<? extends HasSeed> list)として宣言したので使用します。List<Apple>List<HasSeed>

于 2013-03-18T09:30:51.343 に答える