类型安全的服务getter类(返回Parameterized Type)



我想要获得的是可以安全地返回输入类实例的东西。在我的案例中,它被用作服务提供商。代码示例:

 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,失去类型安全?有没有办法避免投射和/或抑制警告?

不,不幸的是,无法避免这种额外的向下转换。请注意,地图的类型为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);
}

这应该在没有下变频的情况下工作:

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

最新更新