我需要一些关于java中泛型和反射的帮助。
我尝试实现的是基于类MyClass
的工厂类返回另一个实现接口MyClassStore
的类Store<MyClass>
。
如何确保使用反射返回正确类型的商店。
参见示例代码:
public class Application {
public static void main(String[] args) {
Store<MyClass> store = Factory.getFactory(MyClass.class);
MyClass myClass = store.get();
System.out.println(myClass.getId());
}
}
public class Factory {
public static <T> Store<T> getFactory(Class<T> type) {
Store<T> store = null;
// TODO: How to implement this
return store;
}
}
public class MyClassStore implements Store<MyClass>{
public MyClass get() {
return new MyClass("1000");
}
}
public interface Store<T> {
public T get();
}
public class MyClass {
private String id;
public MyClass(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
我尝试了不同的方法但却无法按照我想要的方式工作。这是我尝试过的实现。但是有更好的方法吗?
public static <T> Store<T> getFactory(Class<T> type) {
Store<T> store = null;
if (type == MyClass.class) {
store = (Store<T>) new MyClassStore();
}
return store;
}
答案 0 :(得分:0)
只是按照规定解决问题,我能提出的最佳解决方案是在static final Map<Class, Class>
中Factory
映射(在此示例中)从MyClass.class
到{{ 1}},用它来查找要实例化的类,并在从地图检索到的MyClassStore.class
上调用newInstance()
。
使用您的设计更自由一点,您可以将Class
替换为带有MyClassStore
参数的更通用的泛型类,将其存储在本地,并通过调用实现Class<T>
存储的get()
上的newInstance()
。然后,Class
可以简单地创建一个通用存储,并传递getFactory()
对象。
然而,这种类型的代码让我觉得不太可能成为解决你真正问题的好方法。为什么Class
需要创建新的MyClassStore
个对象?为什么MyClass
的任何实现的内部逻辑需要关心Store
实际上是什么类型?在我看来,后一个问题通常是设计不良的强烈指标。