The first one won't work because you're looking up a type at runtime, so that parameter is gone. The second one works fine if you just fix your method declaration. Class
is a parameterized type that you declared raw.
If you do:
Map<Class<? extends AbstractTool>, AbstractTool> ToolMap = new HashMap<Class<? extends AbstractTool>, AbstractTool>();
@SuppressWarnings("unchecked")
public <T extends AbstractTool> T getTool(Class<T> cls){
if (ToolMap.containsKey(cls)) {
return (T) ToolMap.get(cls);
}
else return null;
}
Then you can do:
ToolType t = this.getTool(ToolType.class);