以下代码不起作用(当然),因为标记的行无法编译:
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<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>; // DOES NOT COMPILE
else
return new OtherGenericClass<classes[0]>;
}
}
因此,我实际上不知道“创建”是否会返回
GenericClass<classes[0],classes[1]>
或者
OtherGenericClass<classes[0]>
有不同数量的参数。
发生这种情况是因为我正在使用Spring并且我打算使用MongoDB,但将来我可能需要切换到不同的东西(例如 Hibernate)。
类 GenericClass 类似于:
GenericClass<PersistetType1, Long>
或者
GenericClass<PersistentType2, Long>
其中 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);
怎么办?从控制器(或实体,如果你很挑剔)我需要实例化存储库并调用任何方法。这导致控制器与 MongoDB 耦合,即它们必须显式实例化这样的 GenericClass,它实际上称为 MongoRepository 并且严格依赖于 Mongo(实际上它是一个具有恰好两个“自由度”的泛型)。
所以,我决定创建 MyClass,这是一个隔离控制器的进一步代理。这样,Controller 可以获取 MyClass 的单个实例,并让它创建相应存储库的新实例。特别是,当“somecondition”为真时,意味着我们要使用MongoRepository(当它为假时,可能需要实例化一个Hibernate代理,即HibernateRepository)。但是,MongoRepository 是通用的,因此它需要某种形式的实例化,我希望将其作为参数传递。
不幸的是,泛型是在编译时解决的,因此我猜它们对我不起作用。
我该如何解决?