我有一个返回Map<String, Object>
的实用程序函数,但该Map总是具有以下结构:
{ "a": <something of type1>, "b": <something of type2> }
在外部函数中,我调用此实用程序函数,我想获得与键a
关联的值。我试图做以下事情:
Map<String, Object> data = findData(input); // findData is the utility function
Type1 type1obj = data.get("a"); // error here
但后来我得到了不兼容类型错误:
Required: com.blah.blah.Type1
Found: java.lang.Object
我应该如何获取与密钥a
相关联的值?仅供参考:我对Java非常陌生。
答案 0 :(得分:2)
您需要将从Map检索到的Object转换为您需要的类型:
Type1 type1obj = (Type1) data.get("a");
但是使用上面的代码,你必须确保与key&#34; a&#34;相关联的值的类型。是Type1,否则将在运行时抛出ClassCastException
。
如果您无法保证检索到的对象的类型,您可以将其检查为:
Object obj = data.get("a");
Type1 type1obj;
if(obj instanceof Type1) {
type1obj = (Type1) obj;
} else {
//to print error log or do some workaround
}
答案 1 :(得分:1)
最终,因为您的地图的值类型为Object
,您需要进行转换,但您可以使用类型实用程序方法隐藏它:
@SuppressWarnings("unchecked")
public static <T> T get(Map<String, Object> map, String key) {
return (T)map.get(key);
}
那么由于java的类型推断,这将编译:
Type1 type1obj = get(data, "a");
添加@SuppressWarnings("unchecked")
会阻止您的IDE /编译器抱怨“不安全的强制转换”。
答案 2 :(得分:0)
基本上每当我使用HashMap或任何该地图的地图进行存储时。我倾向于继续施展它。举个例子,我有一个名为Module的类,我得到的是值,键是模块名。我会去 (模块)map.get(modName);