如何从具有不同值类型的Map获取值? (JAVA)

时间:2018-02-07 02:11:49

标签: java dictionary types

我有一个返回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非常陌生。

3 个答案:

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