Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用泛型实现ServiceLocator?_Java_Generics_Hashmap - Fatal编程技术网

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);