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;)
答案 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
也是合法的,但可能不兼容。