1

私はこの擬似コードを持っています:

Example A
Interface Option
Class OptionImplementer implements Option
ArrayList<ArrayList<? extends Option>> test = new ArrayList<ArrayList<OptionImplementer>>(); <-- Fails?

なぜ失敗するのですか?子はOptionを実装しており、extendsの代わりにSuperキーワードも試しました。

「ボーナス」の質問として、これらのコンストラクターの署名は同じ消去を行うと仮定されています。

 Example B
    public void test(ArrayList<ArrayList<? extends Option>> test) {

}
public void test(ArrayList<ArrayList<OptionImplementer>> test) {

}

例AまたはBが機能するはずです。Aは失敗するので、Bは機能するはずです...

4

2 に答える 2

2

失敗してもよろしいですか?そうすべきではありません、そして私がこれを試してみるとそうではありません:

interface Option {}
class Child implements Option {}

public class Example {
    public static void main(String[] args) {
        ArrayList<? extends Option> list = new ArrayList<Child>();
    }
}

ただし、listこのように書くと何も追加できないことに注意してください。このようなリストに追加できない理由は、これまで何度も尋ねられてきました。たとえば、次を参照してください。

于 2012-10-22T11:42:47.860 に答える
1

これは、

ArrayList<ArrayList<? extends Option>>

ArrayList<Option>タイプとArrayList<OptionImplementer>ただしの両方のエントリを含めることができます

ArrayList<ArrayList<OptionImplementer>>()

2番目のタイプのエントリのみを含めることができます。最初のケースでは、以下が許可されます。

test.add(new ArrayList<Option>());
test.add(new ArrayList<OptionImplementer>());

2番目の質問に関しては、関係ありませんが、すべての一般的な情報を削除すると、メソッドが同じ署名を持つことになり、許可されないことを意味します。

于 2012-10-22T13:23:49.940 に答える