我有一个接受Object的方法。在一个用例中,该方法接受HashMap<String, String>
并将每个值设置为相应键名的属性。
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");
}
}
此类遵循特定的接口,因此不能为这些属性添加setter。
我的问题是,如何查看此处输入的类型?
HashMap<String, String> hashMap = (HashMap<String, String>) object;
提前致谢!
解
感谢@drobert的回答,这是我的更新代码:
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();
}
}
答案 0 :(得分:19)
你做不到。由于类型擦除,反射将显示您有一个HashMap实例,但类型在运行时被删除。实际上,你有HashMap&lt;对象,对象&gt;。
那说,你还有一些选择,我建议你采取一些建议。其中:
简而言之:像任何Map一样对待它,并尝试即使没有强制转换也以字符串形式访问键,并尝试通过执行空检查然后调用.toString()来将每个值用作String,并且您将拥有一个更安全的实施。
答案 1 :(得分:4)
应该注意的是,原始例程完全等同于编码
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"));
}
}
显式(HashMap)
强制转换不可能抛出错误,因为它由instanceof
保护。隐式提供的(String)
强制转换仅在从HashMap返回的值不是字符串(或空值)时才会抛出错误。
(“完全等同于”我的意思是产生相同的字节码。)
答案 2 :(得分:2)
您应该使用try-catch,在其中调用addHelper(Object)
方法。这将确保您的HashMap
正确类型。
try{
addHelper(hashMap);
}
catch(ClassCastException ex){
System.out.println("Is not desired hashmap");
}
答案 3 :(得分:0)
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");
}
现在,您知道对象的类型正确 - 甚至是自定义抽象类或其他。