2012-02-26 3 views
0

Я пытаюсь использовать generics для создания объекта, который может быть типом T, возможно ли это?Java - Использование генериков для генерации случайных объектов?

public class SoapObjectToModel <T> { 

    public ArrayList<T> convert(SoapObject soapObject) { 

     ArrayList<T> result = new ArrayList<T>(); 
     // Somehow initialize an object of type T 

     } 
} 
+1

Сколько раз это задавали? –

ответ

4

Вы не можете создать объект типа T.

Всегда помните, что у вас всегда может быть SoapObjectToModel<MyAbstractClass>, и что произойдет, если вы попытаетесь создать T? Будет ли он создавать абстрактный класс?

В качестве обходного пути, вы можете передать элемент типа T в качестве параметра, и использовать reflection, чтобы создать новый объект, или еще лучше - взглянуть на Factory Design Pattern

+0

Будут ли downvoters прокомментировать? – amit

+0

Вы можете сделать это с помощью java-отражения. В примере вашего примера будет выбрано исключение, но, как правило, возможно – Tim

+0

@Tim: как вы можете сделать это без объекта-уступки 'T', вам нужно будет иметь экземпляр, а затем вы можете это сделать, поскольку я или использовать заводской шаблон – amit

1

Использование шаблона фабрики как предложенный amit, является очень хорошим решением этой проблемы, и это также общее решение, которое гарантированно работает. Однако предлагаемая альтернатива использования отражения может быть проще в некоторых случаях. Это практический пример того, как отражение может быть использовано в вашем конкретном случае:

class SoapObjectToModel<T> { 

    private Class<T> type; 

    public SoapObjectToModel(Class<T> type) { 
     this.type = type; 
    } 

    public ArrayList<T> convert(SoapObject soapObject) { 

     try { 
      ArrayList<T> result = new ArrayList<T>(); 
      result.add(type.newInstance()); 
      return result; 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
Смежные вопросы