Следующий код не работает, потому что отмеченная строка не компилируется:Переходя класс к способу создания экземпляра универсального
MyClass {
//singleton stuff
private static MyClass instance;
private MyClass() {}
public static MyClass getInstance() {
if(instance==null) {
instance = new MyClass();
}
return instance;
}
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?> c1, Class<?> c2) {
return new GenericClass<c1,c2>; // DOES NOT COMPILE!!!
}
}
Я не хочу MyClass быть общим. Почему? Поскольку фактическая реализация методы создания похоже на следующее:
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>;
else
return new OtherGenericClass<classes[0]>;
}
Поэтому я не могу пару MyClass к каким-либо конкретным дженерик. Есть ли способ создать экземпляр моего GenericClass с переданными параметрами? Как?
Благодаря
Спасибо за ваши ответы. Я расскажу вам всю историю.
Я использую Spring, и я планирую использовать MongoDB.
Класс GenericClass это что-то вроде:
GenericClass<PersistetType1, Long>
или
GenericClass<PersistentType2, Long>
где PersistentType1/2 классы, что мне нужно, наконец, хранить в БД, в то время, GenericClass является своего рода прокси для доступа к API Mongo. На самом деле это выглядит так:
public MongoTemplate getTemplate();
public void save(T toInsert);
public List<T> select(Query selectionQuery);
public T selectById(ID id);
public WriteResult update(Query selectionQuery, Update updatedAttributes);
public void delete(T toRemove);
public void delete(Query selectionQuery);
Теперь, что? Из контроллеров (или Entity, если вы придирчивы) Мне нужно создать экземпляр репозитория и вызвать любые методы. Это приводит к тому, что контроллеры соединяются с MongoDB, т. Е. Они явно должны создавать экземпляр такого GenericClass, который на самом деле называется MongoRepository и строго зависит от Mongo (на самом деле он является общим с ровно двумя «степенями свободы»).
Итак, я решил создать MyClass, это еще один прокси-сервер, который изолирует контроллеры. Таким образом, контроллер может получить единственный экземпляр MyClass и создать новый экземпляр соответствующего репозитория. В частности, когда «somecondition» истинно, это означает, что мы хотим использовать MongoRepository (когда это ложно, возможно, необходимо создать экземпляр Hibernate proxy, то есть HibernateRepository). Однако MongoRepository является общим, поэтому он требует некоторой формы инстанцирования, которую я надеялся передать в качестве параметра.
К сожалению, дженерики разрешены во время компиляции, поэтому они не работают для меня, я думаю.
Как это исправить?
Нет смысла определять параметры типа во время выполнения из-за стирания типа. Либо пересмотреть свой дизайн, либо не указывать параметры типа. – trutheality
я обобщил свой вопрос здесь: [http://stackoverflow.com/questions/11267441/spring-mongo-generics-flexibility][1] [1]: http://stackoverflow.com/questions/11267441/spring-mongo-generics-flexible – Manu