我想要获得的是可以安全地返回输入类实例的东西。在我的情况下用作服务提供商。代码示例:
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,失去类型安全? 有没有办法避免施放和/或禁止警告?
答案 0 :(得分: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);
}
答案 1 :(得分: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());
}