【问题标题】:Infering generic type without creating new instance在不创建新实例的情况下推断泛型类型
【发布时间】:2018-06-14 16:16:46
【问题描述】:
private HashMap<Object, Object> attribute = new HashMap<>();

public <T> T attributeAs(Object key, T as){
    Object ans = attribute.get(key);
    return ans == null ? null : (T) ans;
}

方法:

ModuleM m = (ModuleM) player.attribute.get("module_m");

除了那个方法,还有什么方法可以在不创建新的类实例的情况下返回一个类型,即:

ModuleM m = person.attributeAs("module_m", new ModuleM());

因为在使用上述方法时,您正在创建一个全新的实例,并且如果 ModuleM 是一个包含大量数据的巨大类,那么这会影响处理能力/速度对吗?

(记住我想要 ModuleM 而不是 Class

【问题讨论】:

    标签: java syntax generic-type-argument


    【解决方案1】:

    您不需要发送实例:

    public <T> T attributeAs(Object key){
        Object ans = attribute.get(key);
        return (T) ans;
    }
    

    编译器将根据调用时的赋值推断类型:

    ModuleM attribute = person.attributeAs("module_m");
    

    当然,在实际实例与具体目标类型不兼容的情况下,您可能会遇到类转换异常,因为您的地图支持 &lt;Object, Object&gt; 条目。那是因为这样的调用:

    String attribute = person.attributeAs("lastName") //probably OK
    

    String attribute = person.attributeAs("module_m") //probably problematic
    

    也是合法的,但可能不兼容。

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多