2

異なるが類似したタイプのリストが必要です。たとえば、さまざまなバリデータ クラスのリストを 1 つのリストに入れたいとします。

例えば:

ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

これは可能ですか?

4

6 に答える 6

4

追加したいだけなら、

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

完全に問題ありません。ただし、サブクラスの型をスーパークラスの型で参照したい場合は、

スーパークラス参照を使用ArrayList< ? extends Validator> validators = new ArrayList<Validator>(); where all your validators extendsして Validator のサブクラスを参照する場合は、 Validator` を使用します。ここでジェネリックワイルドカード演算子について読む

于 2013-09-16T10:00:01.943 に答える
4

はい、バリデーターがスーパークラスを共有している場合は、それをタイプとして指定できます。

List<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

ここでの回答の多くは、最初のタイプを次のように指定しています<? extends Validator>が、それは不要です。2 番目のタイプを Validator サブクラスとして指定できます。つまり、

List<? extends Validator> validators = new ArrayList<ValidatorSubClass>();
于 2013-09-16T10:00:22.660 に答える
2

Validator という名前のスーパー クラスを作成し、StringValidator と IntegerValidator に Validator を拡張 (または実装) させると、次のように ArrayList を初期化できます。

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
于 2013-09-16T10:03:12.703 に答える
1

はい、いつでもできます:

ArrayList<object> validators = new ArrayList<object>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

そしてあなたの場合も

ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());

ご覧のとおり、何が宣言されているかを述べると、T宣言したクラスまたは拡張されたクラスのみをArrayList. そのため、次のように共通の親をValidator指定する場合は、botchStringValidatorIntegerValidatorを追加できます。ArrayList

于 2013-09-16T10:00:31.240 に答える