1

仮定する

    A extends X

オブジェクトに対して何らかの操作を実行する必要があります。A。操作を実行する方法は次のとおりです。

    public void doMagic(List<? extends X> e) 

または、それを呼び出すことを選択することもできます

    public void doMagic2(List<X> e) 

あなたは魔法が行われることを要求します:

    List<X> listOfA = new ArrayList<X>();
    listOfA.add(new A());

    C c = new C();
    c.doMagic(listOfA);   // works as expected
    c.doMagic2(listOfA);  // works as expected

あるアプローチが別のアプローチよりも好まれる理由と、それをいつ使用すべきかを説明してください。

4

2 に答える 2

3

ご想像のとおり、このList<X>タイプのオブジェクトでXのみ機能します。

の場合、 ifのすべてのサブクラスまたはすべての実装のList<? extends X>リストとすべての実装を受け入れます。XXXXinterface

どちらか一方の利点は、まあ、? extends Xあらゆる種類の異なるサブクラスを処理したいときに状況に対処することを可能にします。

例としては、たとえば、ファイルのバイト単位のサイズを計算する関数があります。

public int getTotalSizeInBytes(List<? extends File> files) {
...
}

これで、この関数は、、、などのファイルタイプに関係なくplainTextFile、サイズの計算に取り掛かることができます。excelFilewordFiledatabaseFile

于 2012-08-02T16:03:15.590 に答える
2

次のようなものがあるとします。

    List<A> listOfA = new ArrayList<A>();
    listOfA.add(new A());

を呼び出すことはできdoMagic()ますが、を呼び出すことはできませんdoMagic2()。メソッドでオブジェクトのみを処理しX、その子クラスを処理しないようにする場合は、を使用しますList<X>。ただし、メソッドXが実際に子クラスであるかどうかを気にせずに、あらゆる種類のオブジェクトを処理したい場合は、List<? extends X>

于 2012-08-02T16:05:23.130 に答える