I have a method that accepts an Object. In one use case, the method accepts a HashMap<String, String>
and sets each value to the property of the corresponding key name.
public void addHelper(Object object) {
if (object instanceof HashMap) {
HashMap<String, String> hashMap = (HashMap<String, String>) object;
this.foo = hashMap.get("foo");
this.bar = hashMap.get("bar");
}
}
This class adheres to a particular interface, so adding setters for those properties is not an option.
My question is, how can I check the type cast here?
HashMap<String, String> hashMap = (HashMap<String, String>) object;
Thanks in advance!
SOLUTION
Thanks to the answer from @drobert, here is my updated code:
public void addHelper(Object object) {
if (object instanceof Map) {
Map map = (Map) object;
if (map.containsKey("foo")) this.foo = map.get("foo").toString();
if (map.containsKey("bar")) this.bar = map.get("bar").toString();
}
}
You can't. Due to type erasure, reflection will show you have an instance of HashMap, but the types are dropped at runtime. Effectively, you have HashMap< Object,Object >.
That said, you still have some options, and some advice I'd suggest you take. Among them:
In short: treat this like any Map, and attempt to access the keys as Strings even without the cast, and attempt to utilize each value as a String by doing a null check then calling .toString() and you'll have a much safer implementation.
It should be noted that the original routine is exactly equivalent to coding
public void addHelper(Object object) {
if (object instanceof HashMap) {
HashMap hashMap = (HashMap) object;
this.foo = (String)(hashMap.get("foo"));
this.bar = (String)(hashMap.get("bar"));
}
}
The explicit (HashMap)
cast cannot possibly throw an error, since it's guarded by the instanceof
. The implicitly-supplied (String)
casts will only throw an error if the values returned from the HashMap are not Strings (or nulls).
(By "exactly equivalent to" I mean that the same bytecode is produced.)
You should use try-catch, where you call addHelper(Object)
method. This will ensure your correct type of HashMap
.
try{
addHelper(hashMap);
}
catch(ClassCastException ex){
System.out.println("Is not desired hashmap");
}
try{
HashMap<String, String> hashMap = (HashMap<String, String>) object;
this.foo = hashMap.get("foo");
this.bar = hashMap.get("bar");
}catch(ClassCastException e){
System.err.log("Object is not a hashmap");
}
Now, you know the object is of the correct type - even a custom abstract class or otherwise.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.