2015-02-17 2 views
0

Я пытаюсь написать фабричный класс для возврата экземпляра класса с общим типом параметра. Я думаю, что это можно сделать, используя отражение, но я смущен относительно того, как.Создание экземпляра класса с типичным параметром типа в java

Вот пример того, что я пытаюсь сделать.

public class GenericObjectFactory { 

public GenericObject<?> getGenericObject(Class clazz){ 
// I want to return a new instance here of the generic object with type parameter clazz. So something like this... 
return new GenericObject<clazz>(); 

}

кто-либо идеи, как это делается?

Я знаю, что могу создать clazz с newInstance, но я хочу GenericObject. ie getGenericObject (string.getClass()) возвращает новый GenericObject < String>();

Извините, это сообщение немного путано. Надеюсь, это имеет смысл. Заранее спасибо.

Tracey

ответ

0

Типичный прозрачный раствор для вашей проблемы заключается в следующем:

public class GenericObjectFactory { 
    public <T> GenericObject<T> getGenericObject(Class<T> clazz){ 
     return new GenericObject<T>(); 
    } 
} 

С T стиранию, поэтому новый созданный экземпляр GenericObject даже «не знает», что значение его параметра T, вы, вероятно, хотите передать clazz в конструктор GenericObject

public class GenericObjectFactory { 
    public <T> GenericObject<T> getGenericObject(Class<T> clazz){ 
     return new GenericObject<T>(clazz); 
    } 
} 

Очевидно вы должны определить такой конструктор.

EDIT

Вот пример использования:

GenericObjectFactory factory = new GenericObjectFactory(); 
GenericObject<String> gs = factory.getGenericObject(String.class); 
GenericObject<Integer> gs = factory.getGenericObject(Integer.class); 
+0

Неужели это не оставит меня с той же проблемой? Только теперь мне нужно создать экземпляр класса в конструкторе, а не на фабрике? –

+0

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

+0

Я понимаю, что мой код неправильный. Я просто использовал пример, чтобы объяснить, что я пытаюсь сделать. Если бы это было правильно, мне не пришлось бы задавать вопрос ... В конструкторе, хотя даже с вашим примером я не уверен, как создать экземпляр класса с определенным типом, который передается во время выполнения. –

0

Я думаю, вам нужно следующее: использование

public <T> GenericObject<T> getGenericObject(){ 
    return new GenericObject<T>(); 
} 

Пример:

GenericObject<String> obj = genericObjectFactory.getGenericObject(); 
+0

но как он знает, что Т? Я явно передаю T in. Я хочу, чтобы T был clazz в приведенном выше примере. –

+0

Вам не нужно делать это явно. Он определит тип, посмотрев на переменную (obj в моем примере) –

+0

Проблема с этим - мой прецедент. Хотя, возможно, есть лучший способ сделать это. Поэтому я пытаюсь подключить фасоль с весной, и я хотел получить общий боб, основанный на типе, который я передаю. Так что-то вроде:

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