Sha*_*vil 14 java object unchecked-cast
我有一个接受Object的方法.在一个用例中,该方法接受a 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");
}
}
Run Code Online (Sandbox Code Playgroud)
此类遵循特定接口,因此不能为这些属性添加setter.
我的问题是,如何检查此处的类型?
HashMap<String, String> hashMap = (HashMap<String, String>) object;
Run Code Online (Sandbox Code Playgroud)
提前致谢!
解
感谢@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();
}
}
Run Code Online (Sandbox Code Playgroud)
dro*_*ert 20
你不能.由于类型擦除,反射将显示您有一个HashMap实例,但类型在运行时被删除.实际上,你有HashMap <Object,Object>.
也就是说,你仍然有一些选择,我建议你采取一些建议.其中:
简而言之:像对待任何Map一样处理它,并尝试即使没有强制转换也以字符串形式访问键,并尝试通过执行空检查然后调用.toString()来将每个值用作String,并且您将更安全实现.
需要注意的是,原来的例程完全等同于编码
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
显式转换(HashMap)不可能抛出错误,因为它由instanceof. (String)如果从 HashMap 返回的值不是字符串(或空值),则隐式提供的强制转换只会引发错误。
(“完全等同于”是指产生相同的字节码。)
| 归档时间: |
|
| 查看次数: |
41434 次 |
| 最近记录: |