How to get values from a Map with different value types? (Java)

好久不见. 提交于 2021-02-05 10:48:22

问题


I have a utility function that returns Map<String, Object>, but that Map always has this structure:

{ "a": <something of type1>, "b": <something of type2> }

In outer function, where I call this utility function, I want to get the value associated with key a. I'm trying to do something such as:

Map<String, Object> data = findData(input); // findData is the utility function
Type1 type1obj = data.get("a"); // error here

But then I get the Incompatible Types error:

Required: com.blah.blah.Type1
Found: java.lang.Object

How am I supposed to grab the value associated with key a? FYI: I'm VERY new to Java.


回答1:


You need to cast the Object retrieved from Map to the type you required:

Type1 type1obj = (Type1) data.get("a");

But with the code above you have to make sure the type of value associated with key "a" is Type1, otherwise a ClassCastException will thrown at runtime.

If you cannot guarantee the type of the Object retrieved, you can check it like:

Object obj = data.get("a");
Type1 type1obj;
if(obj instanceof Type1) {
    type1obj = (Type1) obj;
} else {
    //to print error log or do some workaround
}



回答2:


Ultimately, because your map has Object as its value type, you need to cast, but you can hide this with a typed utility method:

@SuppressWarnings("unchecked")
public static <T> T get(Map<String, Object> map, String key) {
    return (T)map.get(key);
}

So then due to java's type inference this will compile:

Type1 type1obj = get(data, "a");

Adding @SuppressWarnings("unchecked") stops your IDE/compiler complaining about an "unsafe cast".




回答3:


Basically whenever I reach this point of storing with a HashMap or any map for that sort. I tend to go ahead and cast it. Take for example I have a class named Module that I am getting the value of and the key is the module name. I would go (Module) map.get(modName);



来源:https://stackoverflow.com/questions/48654907/how-to-get-values-from-a-map-with-different-value-types-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!