有了这个界面:
public interface ServiceLocator {
<T> void setService(Class<T> klass, Factory<T> factory)
<T> void setConstant(Class<T> klass, T value)
<T> T getObject(Class<T> klass)
}
我该如何实施?我的意思是,我如何声明结构数据? 这是对的吗?
private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();
答案 0 :(得分:0)
private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();
如果你想使用这种结构,你可以这样声明:
private Map<Class<?>, Factory<T>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();
请记住Factory<T>
来抓住这个类型。
使用Class可以使用AnyClass.class作为Key
顺便说一句,你可以将所有内容放在一个地图中,如private Map<Class<?>, Object>
,如果它是工厂,则可以在get函数中投射它;)
答案 1 :(得分:0)
解决方案:
private Map<Class<?>, Factory<?>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();
将-Xlint:unchecked
指令添加到编译器选项中。
并@SuppressWarnings("unchecked")
了解您需要的方法。在我的情况下是getObject
方法。
答案 2 :(得分:0)
Guava有一个用于类似目的的接口:ClassToInstanceMap<B>
。 API是:
<T extends B> T getInstance(Class<T> type);
<T extends B> T putInstance(Class<T> type, T value);
查看MutableClassToInstanceMap.java
中的实施情况,我们发现它使用HashMap<Class<? extends B>, B>
包裹的ConstrainedMap
。其MapConstraint
使用java.lang.Class.cast()
来确保地图中的所有值都是其相应键的合法实例。
由于B
通常只是Object
,因此实施HashMap
最终只是HashMap<Class<? extends Object>, Object>
。