0

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

 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,从而失去类型安全性?有没有办法避免强制转换和/或抑制警告?

4

2 回答 2

1

不,不幸的是,没有办法避免这种额外的沮丧。请注意,您的地图类型是Map<String, Object>. Object- 这就是 Java 编译器对值的全部了解。您必须以某种方式声明地图具有不同类型的每个键。不可能的。

但是您的代码可以简化一点:

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

另一个轻微的改进涉及使用Classas key:

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

public <E> E getService(Class<E> service) {
    return (E) mServices.get(service);
}
于 2013-02-09T21:34:15.213 回答
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());
}
于 2013-02-09T21:45:33.040 回答