我正在尝试写一个好奇的方法:
Map<Class, AbstractTool> ToolMap = new HashMap<Class, AbstractTool>();
//init'd correctly
@SuppressWarnings("unchecked")
public <T extends AbstractTool> T getTool(Class cls){
if (ToolMap.containsKey(cls)) {
return (T) ToolMap.get(cls);
}
else return null;
}
在一个奇怪的事件转折中,这段代码实际上做了我需要做的事情。我的主要问题是,为了调用它,我必须进行这些大调用:
this.getTool<ToolType>(ToolType.class);
不酷。
有没有办法编写此方法,以便它具有以下签名?:
ToolType t = this.getTool<ToolType>();
或者这个
ToolType t = this.getTool(ToolType); // This one seems impossible without casting.
答案 0 :(得分:2)
第一个不起作用,因为你在运行时查找一个类型,所以参数消失了。如果您只修复方法声明,第二个工作正常。 Class
是您声明为raw的参数化类型。
如果你这样做:
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;
}
然后你可以这样做:
ToolType t = this.getTool(ToolType.class);