2013-02-09 141 views
0

我想获得的是可以安全地返回输入类实例的东西。在我的情况下被用作服务提供者。代码示例:类型安全服务getter类(返回参数化类型)

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

我承认我不擅长参数化类型,我需要一些帮助。我没有从地图中获取对象吗?为什么我需要投入E,放弃类型安全? 有没有办法避免铸造和/或压制警告?

回答

1

不,不幸的是没有办法避免这种额外的沮丧。注意你的地图的类型是Map<String, Object>Object - 这是所有Java编译器都知道的值。你必须以某种方式声明地图具有不同类型的每个键。不可能。

但你的代码可以简化一下:

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service.getName()); 
} 

另一个稍有好转涉及使用Class关键:

private Map<Class<?>, Object> mServices; 

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service); 
} 
+0

哦感谢您的改进! 如果我把Map mServices? 虽然编译器给我一个put方法的错误。 – 2013-02-09 21:43:30

+1

@Kap:即使它有效,你会期待什么? Map.get()会返回一些扩展Object的类(根据类型声明)。你不需要这个额外的''?延伸'知道这一点。 – 2013-02-09 21:45:34

0

这应该没有丧气工作:

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()); 
} 
+0

是的,这会起作用,但我需要每种类型都有一个Service类。对?我想要的是一个集中的Service getter。 – 2013-02-09 21:52:39