I have a utility function that returns Map
, but that Map always has this structure:
{ \"a\": , \"b\"
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);
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
}
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".