2017-05-11 11 views
0

この質問はおそらく様々な方法で求められていますが、名前を知らない問題を探すのは難しいでしょう。したがって、最も簡単な方法は次のとおりです。Javaでバインドされたパラメータを持つ汎用オブジェクトを返す

class Digestable {} 
class Mouse extends Digestable {} 
class Cat extends Animal<Mouse> {} 

class Animal<T extends Digestable> { 
    List<T> belly = new ArrayList<>(); 

    void eat(T a) { 
     belly.add(a); 
    } 
} 

class main { 
    <T extends Digestable> Animal<T> returnAnimal() { 
     return new Cat(); <--- compiler error! 
    } 
} 

なぜコンパイラエラー?新しいCat()は、returnAnimal()の型とT型のDigestableを文字通り満たします。コンパイラがhirarchyの型をチェックできないのはなぜですか?

+3

パラメータを満たしていません。もう一度見てください。 'Cat'は' Animal 'を拡張しますが、' T'は 'Mouse'以外のものでもあります。 –

+0

@ user264235あなたが試したことを想像してみましょう: 'Animal a = returnAnimal()'、 'Rat'は' Digestable'のサブクラスです。何が起こるべきだと思いますか? – shmosel

答えて

0

CatAnimal<Mouse>であり、returnAnimal方法はTDigestableの任意子孫であると、Animal<T>を返すため。 Javaでは、Animal<Mouse>は、Animal<Zebra>とは異なるタイプのものです。

あなたの例によると、マウス(猫など)を食べる動物はシマウマを食べる動物(ライオンなど)とはまったく違うので、これは完璧な意味合いがあります。

+1

皆さんは私に正しい方向を指摘し、タイプパラメータ 'T'とワイルドカード'? 'の違いを理解する助けになりました。 'returnAnimal()'メソッドの意図は、「少なくとも消化可能なものを食べる動物をあなたから手に入れたいです。 ' Animal 'の署名は、「少なくとも何か消化可能なものを食べる動物」ではなく、 ''動物<? Digestable> '**は拡張されています。これを使用してコンパイラは不平を言うことはありません。 – user264235

関連する問題