問題はメソッドの戻り型ではなく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
ステートメントは正常に機能します。Animal
Object
super-type
Dog
しかし、が適合しない理由はfirst one
、クラスを次のように宣言しているためです。
public class Mixer<A extends Animal>
したがって、またはそのクラスのいずれかに関連付けることができるbound
あなたがあります。さて、はのサブタイプではないので、単に作成することはできません:-type
Mixer
Animal
subtype
Object
Animal
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