以下代码不起作用,因为标记的行不能编译:
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!!!
}
}
Run Code Online (Sandbox Code Playgroud)
我不希望MyClass成为通用的.为什么?因为create方法的实际实现类似于以下内容:
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>;
else
return new OtherGenericClass<classes[0]>;
}
Run Code Online (Sandbox Code Playgroud)
因此,我无法将MyClass与任何特定的泛型相结合.有没有办法用传递的参数实例化我的GenericClass?怎么样?
谢谢
谢谢您的回答.我会告诉你整个故事.
我正在使用Spring,我计划使用MongoDB.
GenericClass类是这样的:
GenericClass<PersistetType1, Long>
Run Code Online (Sandbox Code Playgroud)
要么
GenericClass<PersistentType2, Long>
Run Code Online (Sandbox Code Playgroud)
其中PersistentType1/2是我最终需要存储在数据库中的类,而GenericClass是一种访问Mongo API的代理.事实上,它看起来像:
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);
Run Code Online (Sandbox Code Playgroud)
怎么办?从控制器(或实体,如果你挑剔)我需要实例化存储库并调用任何方法.这导致控制器与MongoDB耦合,即它们明确地必须实例化这样的GenericClass,它实际上被称为MongoRepository并且严格依赖于Mongo(实际上它是具有两个"自由度"的通用).
所以,我决定创建MyClass,这是另一个隔离控制器的代理.通过这种方式,Controller可以获取MyClass的单个实例,并让它创建相应存储库的新实例.特别是,当"somecondition"为真时,这意味着我们想要使用MongoRepository(当它为false时,可能需要实例化Hibernate代理,即HibernateRepository).但是,MongoRepository是通用的,因此它需要某种形式的实例化,我希望将其作为参数传递.
遗憾的是,泛型在编译时得到解决,因此我认为它们对我不起作用.
我该如何解决这个问题?