3

次のクラスがあります。

public class LivingBeing { … }

それからあります

public class Human extends LivingBeing { … }

今、このラッパーもあります:

public class LivingBeingWrapper<T extends LivingBeing> { … }

そして、絵を完成させるための方法もあります

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

次のコードを書くとき

LivingBeingWrapper<Human> wrapper = createHumanWrapper();
validate(wrapper);

次のコンパイルエラーが発生します。

タイプMyTypeのメソッドvalidate(LivingBeingWrappe <LivingBeing> livingBeingWrapper)は、引数(LivingBeingWrapper <Human>)には適用できません。

しかし、なぜ?Human拡張しLivingBeingます。

4

3 に答える 3

6

バナナは-果物です。しかし、バナナのリストは果物のリストではありません。それ以外の場合は、バナナのリストを取得してリンゴを追加することができます(リンゴ果物である場合)。

それはかなりゲノムに聞こえますが、それは上で起こっていることの鍵です。を拡張する型を取るようにラッパーを指定する必要がありますLivingBeing

詳細については、この記事、特に「ジェネリックは共変ではない」セクションを参照してください。

于 2012-10-03T08:30:48.353 に答える
3

メソッドは、でパラメータ化validateされた状態で呼び出す必要があることを宣言しています。ただし、でパラメータ化されたものを渡しています。これからメソッド宣言を変更してみてください:LivingBeingWrapperLivingBeingLivingBeingWrapperHuman

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

これに:

public boolean validate(LivingBeingWrapper<? extends LivingBeing> livingBeingWrapper)
于 2012-10-03T08:31:31.153 に答える
1

以下の方法を変更してください:-

public boolean validate(LivingBeingWrapper<LivingBeing> livingBeingWrapper)

public boolean validate(LivingBeingWrapper<T> livingBeingWrapper)

このメソッドはクラス内にあるため、次のようになります。-

public class LivingBeingWrapper<T extends LivingBeing> 

したがって、メソッドパラメータでタイプTを使用でき、TはHorse..に置き換えられます。特定の参照用に..

また、メソッドがのタイプとは異なるタイプをとるclass definition (T)場合は、次の宣言を使用できます。

public boolean validate(LivingBeingWrapper<? extends LivingBeing> 
                                                    livingBeingWrapper)

ここで、を呼び出す必要がある場合は、validate(LivingBeingWrapper<Human>)ジェネリック型パラメーターtypeを受け取るようにメソッドを定義する必要があります。これは、型が何であるかをHuman拡張します(クラス定義でLivingBeingも拡張するため)LivingBeingT

于 2012-10-03T08:31:26.060 に答える