2
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
public class Mixer<A extends Animal>{
    public <C extends Cat> Mixer<? super Dog> useMe(A a, C c){
        //return new Mixer<Object>();//KO
        return new Mixer<Animal>(); //OK
    }
}

戻りパラメータはMixer<? super Dog>、が下限のワイルドカードで定義されている場合にそうです。

を返すMixer<Object>とコンパイラエラーが発生し、でコンパイラエラーが発生しないのはなぜMixer<Animal>ですか?

4

1 に答える 1

6

問題はメソッドの戻り型ではなくGeneric Type、クラスにバインドされていることですMixer

何が悪かったのか見てみましょう:-

public <C extends Cat> Mixer<? super Dog> useMe(A a, C c)

返品タイプMixer<? super Dog>とは、任意MixerのタイプDogまたはsuper-type犬のを返品できることを意味しますAnimal

    //return new Mixer<Object>();//KO
    return new Mixer<Animal>(); //OK

したがって、とはの両方であるため、両方のreturnステートメントは正常に機能します。AnimalObjectsuper-typeDog

しかしが適合しない理由はfirst one、クラスを次のように宣言しているためです。

public class Mixer<A extends Animal>

したがって、またはそのクラスのいずれかに関連付けることができるboundあなたがあります。さて、はのサブタイプではないので、単に作成することはできません:-typeMixerAnimalsubtypeObjectAnimal

new Mixer<Object>();

したがって、次のようにクラスのインスタンスを作成できます。-

new Mixer<Animal>(); // OR
new Mixer<Dog>();  // Dog extends Animal  // OR
new Mixer<Cat>();  // Cat extends Animal

// **** But NOT like this ******
new Mixer<Object>();  // Object does not extend Animal
于 2012-10-15T09:50:43.810 に答える