2013-03-29 3 views
13

Обычно, если мы хотим, чтобы инициализировать общий непримитивный ArrayList мы делаем этоДинамическая инициализация ArrayList <anyClassObject>

ArrayList<?> arrayList = new ArrayList<MyClass.class>(); 

Но я хочу сделать что-то подобное этому независимо от того, какой объект класса я прохожу, т.е.

private void getModel(Class responseType){ 

    //Something similar, because this does not work..              
    ArrayList<?> arrayList = new ArrayList<responseType>(); 
} 

Любая помощь будет принята с благодарностью.

+2

Как об этом частном void getModel (T extends Object) { ArrayList arrayList = new ArrayList (); } – vinoth

+0

Что вы хотите сделать ?? – Piyush

+1

Дженерики предназначены для обеспечения безопасности типа времени компиляции. 'ArrayList ' стирается после 'ArrayList' после компиляции. Невозможно вызвать 'new ArrayList ()' во время выполнения, вам нужно вызвать 'new ArrayList()'. –

ответ

17

Try что-то вроде этого

 private <T> void setModel(Class<T> type) { 
     ArrayList<T> arrayList = new ArrayList<T>(); 
    } 

Если вы хотите, чтобы получить список тогда

private <T> ArrayList<T> getModel(Class<T> type) { 
     ArrayList<T> arrayList = new ArrayList<T>(); 
     return arrayList; 
    } 

EDIT

ПОЛНЫЙ ПРИМЕР показывающего использование шаблонного типа для ArrayList

тестер класс с основным методом и общего методом

public class Tester { 

    private <T> ArrayList<T> getModels(Class<T> type) { 
     ArrayList<T> arrayList = new ArrayList<T>(); 
     return arrayList; 
    } 


    public static void main(String[] args) { 
     Data data = new Data(12, "test_12"); 
     Magic magic = new Magic(123, "test_123"); 

     Tester t = new Tester(); 

     ArrayList<Data> datas = (ArrayList<Data>) t.getModels(Data.class); 
     datas.add(data); 
     for(Data data2 : datas) { 
      System.out.println(data2); 
     } 

     ArrayList<Magic> magics = (ArrayList<Magic>) t.getModels(Magic.class); 
     magics.add(magic); 
     for(Magic magic2 : magics) { 
      System.out.println(magic2); 
     } 

    } 

} 

Другой возможностью использовать одни и те же вещи без параметра, так как мы не используем его внутри метода

public class Tester { 

    private <T> ArrayList<T> getModel() { 
     ArrayList<T> arrayList = new ArrayList<T>(); 
     return arrayList; 
    } 


    public static void main(String[] args) { 
     Data data = new Data(12, "test_12"); 
     Magic magic = new Magic(123, "test_123"); 

     Tester t = new Tester(); 

     ArrayList<Data> datas = t.getModel(); 
     datas.add(data); 
     for(Data data2 : datas) { 
      System.out.println(data2); 
     } 

     ArrayList<Magic> magics = t.getModel(); 
     magics.add(magic); 
     for(Magic magic2 : magics) { 
      System.out.println(magic2); 
     } 

    } 

} 

класс Model (Data)

public class Data { 

    private Integer id; 
    private String name; 


    public Data() { 
    } 


    public Data(Integer id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    @Override 
    public String toString() { 
     return "Data [" + (id != null ? "id=" + id + ", " : "") + (name != null ? "name=" + name : "") + "]"; 
    } 

} 

класс Model (Magic)

public class Magic { 

    private Integer id; 
    private String name; 


    public Magic() { 
    } 


    public Magic(Integer id, String name) { 
     super(); 
     this.id = id; 
     this.name = name; 
    } 


    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    @Override 
    public String toString() { 
     return "Data [" + (id != null ? "id=" + id + ", " : "") + (name != null ? "name=" + name : "") + "]"; 
    } 

} 
+0

Вам не нужен параметр 'Class ', так как он никогда не используется. Просто оставьте это, и тип будет выведен из сайта вызова. Конечно, вы только что заново изобрели метод 'List.NewArrayList()' Guava. –

+0

@Festus, где вы производите класс? i.e Класс тип? –

+0

@Festus Tamakloe это сработало !!! Большое спасибо !! :) серьезно –

0

Попробуйте использовать следующие

public <T> List<T> getList(Class<T> requiredType) { 
    return new ArrayList<T>(); 
} 

public void useList() { 
    List<Integer> ints = getList(Integer.class); 
    List<String> lists = getList(String.class); 
} 
+1

. case, вы не используете 'requiredType'. Почему бы просто не объявить его как 'public Список getList()'? – newacct

+0

, если у вас есть сценарий, в котором вам известен тип класса объекта (возможно, вы загружаете некоторые данные из файла с информацией о имени класса и т. Д.), Тогда этот метод был бы полезен. Потому что в противном случае вам придется придать правильному типу с проверками if/else. Но вы правы. Кроме как в таком сценарии мы можем просто иметь T или просто не должны иметь такой метод вообще –

2

Это работает:

private void getModel(){ 
    ArrayList<?> arrayList = new ArrayList<Object>(); 
} 

Я имею в виду, не ясно, что вы пытаетесь сделать. Generics является чисто компилятором, для выполнения проверки типа компиляции. Поэтому, если параметр типа неизвестен во время компиляции, это было бы бесполезно.

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