从Java中的Generic方法获取子类

时间:2014-05-09 02:09:56

标签: java class generics abstract

我正在尝试写一个好奇的方法:

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.

1 个答案:

答案 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);