Java 类型安全服务getter类(返回参数化类型)
我想要得到的是能够安全返回输入类实例的东西。在我的例子中,它被用作服务提供商。代码示例:Java 类型安全服务getter类(返回参数化类型),java,parameterized,Java,Parameterized,我想要得到的是能够安全返回输入类实例的东西。在我的例子中,它被用作服务提供商。代码示例: public class MyClass { private Map<String, Object> mServices; public MyClass() { mServices = new HashMap<String, Object>(); mServices.put(XmlService.class.getName(),
public class MyClass {
private Map<String, Object> mServices;
public MyClass() {
mServices = new HashMap<String, Object>();
mServices.put(XmlService.class.getName(), new XmlService());
}
public <E extends Object> E getService(Class<?> service) {
return (E) mServices.get(service.getName());
}
}
公共类MyClass{
私人地图服务;
公共MyClass(){
mServices=newhashmap();
mServices.put(XmlService.class.getName(),new XmlService());
}
公共电子服务(班级服务){
返回(E)mServices.get(service.getName());
}
}
我承认我对参数化类型没有那么熟练,我需要一些帮助。我是不是从地图上找不到东西?为什么我需要转换为E,失去类型安全?
有没有办法避免投射和/或抑制警告?没有,不幸的是,没有办法避免这种额外的向下投射。请注意,地图的类型是
map
<代码>对象——这就是Java编译器对值的全部了解。您必须以某种方式声明映射具有不同类型的每个键。不可能
但您的代码可以简化一点:
public <E> E getService(Class<E> service) {
return (E) mServices.get(service.getName());
}
这应该在没有沮丧情绪的情况下起作用:
public class ServiceLoader<T extends AbstractService> {
private Map<String, T> services = new HashMap<String, T>();
T getService(Class<T> componentType) {
return services.get(componentType.getName());
}
公共类服务加载器{
私有映射服务=新的HashMap();
T getService(类组件类型){
return services.get(componentType.getName());
}
噢,谢谢你的改进!如果我放置Map mServices呢?编译器在put方法上给了我一个错误。@Kap:即使它工作了,你会期望什么?Map.get()
将返回一些扩展对象的类(根据类型声明)。你不需要这个额外的?扩展来了解这一点。是的,这会起作用,但我需要每个类型有一个服务类。对吗?我想要的是一个集中式服务获取程序。
public class ServiceLoader<T extends AbstractService> {
private Map<String, T> services = new HashMap<String, T>();
T getService(Class<T> componentType) {
return services.get(componentType.getName());
}