【问题标题】:Get subclass from Generic method in Java从Java中的通用方法获取子类
【发布时间】:2014-05-09 02:09:56
【问题描述】:

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

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.

【问题讨论】:

    标签: java class generics abstract


    【解决方案1】:

    第一个不起作用,因为您在运行时查找类型,因此该参数消失了。如果您只是修复您的方法声明,第二个工作正常。 Class 是您声明为原始的参数化类型。

    如果你这样做:

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

    【讨论】:

    • 既然你有cls,可能值得用它来进行检查演员,这将摆脱警告(return cls.cast(ToolMap.get(cls))
    • 非常感谢。尽管 C# 和 java 非常相似,但这些小细节总能打动我。
    猜你喜欢
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多