1
   protected List<? extends ErrorTO> errors = new ArrayList<ErrorTO>();

    public abstract Collection<? extends ErrorTO> getErrors();

    public void registerError(ErrorTO e) {
        errors.add(e);
    }

行「errors.add(e)」のコンパイルエラーがあります。これは、ある種の「?extends ErrorTO」を予期しており、ErrorTOが好きではありませんか?なぜそしてそれを修正するのですか?ありがとう!

4

4 に答える 4

2

コンパイラは、それが;getErrorsを返すことを知りません。Collection<ErrorTo>代わりに を返す場合がありCollection<SomeSubclassOfErrorTo>ます。その後、このサブクラスではない をコレクションに追加しようとするとErrorTo、タイプ セーフに違反します。このため、コンパイラはこれを許可しません。

于 2012-07-04T21:44:50.697 に答える
1

には何も追加できませんList<? extends ErrorTO>。にしList<ErrorTO>ます。

List<? extends ErrorTO>意味: ErrorTO または ErrorTO を拡張する未知のクラスのリスト。したがって、明らかに、何かを追加できれば、その型安全性は破られます。

于 2012-07-04T21:45:45.770 に答える
1

List<? extends ErrorTO>拡張するものを含むことができるリストではありませんErrorTO

の (未指定の) サブクラスのリストですErrorTO

MyErrorTOextendsの場合ErrorTO、 を作成してList<MyErrorTO>に割り当てることができますerrors

あなたのコードは、私のリストに を追加しようとしますがErrorTO、これは違法です - 私のリストには、特定のサブクラスのみを含めることができますErrorTO

于 2012-07-04T21:47:31.667 に答える
0

多分これは少し役立つでしょう。クラスがあるとしましょう

class Fruit {}
class Pear extends Fruit{ void methodA(){} }
class Apple extends Fruit{ void methodB(){} }

このようなメソッドを作成したい

public static void method(List<? extends Fruit> list, Fruit f) {
    list.add(f); //<-- why is this forbidden?
}

list引数として、このメソッドは次のようなリストを受け入れることができます

ArrayList<Fruit>
ArrayList<Apple>
ArrayList<Pear>

引数が の場合new ArrayList<Pear>();、コンパイラは Fruit や Apple などの要素を追加できません。

しかし、コンパイラは、彼が扱うリストの種類を知ることができません。その知識不足のため、List<? extends Fruit> list参照を介して要素を追加することは不可能です。

于 2012-07-04T22:36:54.777 に答える