異なるが類似したタイプのリストが必要です。たとえば、さまざまなバリデータ クラスのリストを 1 つのリストに入れたいとします。
例えば:
ArrayList<T> validators = new ArrayList<T>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
これは可能ですか?
追加したいだけなら、
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` を使用します。ここでジェネリックワイルドカード演算子について読む
はい、バリデーターがスーパークラスを共有している場合は、それをタイプとして指定できます。
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>();
Validator という名前のスーパー クラスを作成し、StringValidator と IntegerValidator に Validator を拡張 (または実装) させると、次のように ArrayList を初期化できます。
ArrayList<Validator> validators = new ArrayList<Validator>();
validators.add(new StringValidator());
validators.add(new IntegerValidator());
はい、いつでもできます:
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
指定する場合は、botchStringValidator
とIntegerValidator
を追加できます。ArrayList