Java 如何使用泛型实现ServiceLocator?
具有此接口:Java 如何使用泛型实现ServiceLocator?,java,generics,hashmap,Java,Generics,Hashmap,具有此接口: 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) } 公共接口ServiceLoca
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)
}
公共接口ServiceLocator{
无效设置服务(klass类,工厂)
无效设置常数(klass类,T值)
T getObject(类klass)
}
我如何实现它?我的意思是,我如何声明结构数据?
是这样吗
private Map<Class, Factory> services = new HashMap<>();
private Map<Class, Object> constants = new HashMap<>();
private Map services=new HashMap();
私有映射常量=新HashMap();
private Map services=new HashMap();
私有映射常量=新HashMap();
如果要使用此结构,可以这样声明:
private Map<Class<?>, Factory<T>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();
private-Map,Object>constants=new-HashMap();
记住放入工厂
以捕获类型。
通过使用类,可以使用AnyClass.Class作为键
顺便说一句,您可以将所有内容放在一个地图中,如私有地图解决方案:
private Map<Class<?>, Factory<?>> services = new HashMap<>();
private Map<Class<?>, Object> constants = new HashMap<>();
private Map>services=new HashMap();
私有地图Guava有一个用于类似目的的接口:。API是:
<T extends B> T getInstance(Class<T> type);
<T extends B> T putInstance(Class<T> type, T value);
T getInstance(类类型);
T putInstance(类类型,T值);
查看中的实现,我们看到它使用了一个hashMap。这样,您仍然可以添加通配符来消除原始类型警告<代码>映射>
。但是使用泛型来拥有安全类型不是很重要吗?我引用的是具有对象类型的常量声明。这样,当我对一个常量执行getObject
时,我就被迫执行一个cast:(T)constants.get(klass)
这是不对的,不是吗?您无法通过类型系统获得那种级别的安全性。但是你已经有了(大部分)封装形式的映射。没有安全的方法让映射为每个键返回不同的泛型类型。Java类型系统的功能不足以证明你所做的是类型安全的。您可以自己证明这一点,并使用不安全的强制转换对类型系统隐藏这一点,但这是您所能做的最好的事情。MapWell是的,如果是这样的话,使用两个映射会更干净;)
<T extends B> T getInstance(Class<T> type);
<T extends B> T putInstance(Class<T> type, T value);