Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 类型安全服务getter类(返回参数化类型)_Java_Parameterized - Fatal编程技术网

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