2013-09-16 2 views
3

Я хочу иметь список, имеющий разные, но похожие типы. Например, я хочу поместить список разных классов валидатора в один список.ArrayList <T> с различными типами для T

Например:

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

Возможно ли это сделать?

ответ

5

Вот полный пример того, как вы можете это сделать:

Во-первых, определить интерфейс:

public interface Validator { 
    void validate(); 
} 

Затем создайте реализацию:

public class IntegerValidator implements Validator { 

    public void validate() { 
     // Validate 
    } 
} 

Реализация валидатор Струнный :

public class StringValidator implements Validator { 
    public void validate() { 
     // Validate 
    } 
} 

Код для контакта:

public class Test { 

    public static void main(String[] args) { 
     List<Validator> v = new ArrayList<Validator>(); 
     v.add(new StringValidator()); 
     v.add(new IntegerValidator()); 

     for (Validator validator : v) { 
      validator.validate(); 
     } 
    } 
} 
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, используя ссылку суперкласса. Читайте о generics wildcard operator here

4

Да, если валидаторы разделяют суперкласс, вы можете указать это как тип.

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

Многие ответы здесь указать первый тип, как <? extends Validator>, но это не нужно. Это позволит вам указать второй тип в качестве средства проверки подкласса, т.е.

List<? extends Validator> validators = new ArrayList<ValidatorSubClass>(); 
2

да, то вы всегда можете сделать:

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, то вы можете добавить Провал StringValidator и IntegerValidator к ArrayList

2

создать супер класс с именем Validator, и пусть StringValidator и IntegerValidator продолжается (или реализации) валидатора, то вы можете инициализировать Ваш ArrayList как это:

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

Согласно Generics tutorial, вы можете использовать

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

гдеи IntegerValidator удлинить Validator.

Смежные вопросы