在不创建新实例的情况下推断泛型类型

时间:2018-06-14 16:16:47

标签: java syntax generic-type-argument

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&lt; ModuleM&gt;)

1 个答案:

答案 0 :(得分:4)

您不需要发送实例:

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

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

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

但是,当然,在实际实例与具体目标类型不兼容的情况下,您可能会获得类转换异常,因为您的映射支持<Object, Object>条目。那是因为如下的电话:

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

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

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