如果对象实例为HashMap,如何检查键和值的类型?

时间:2013-10-03 15:43:15

标签: java object unchecked-cast

我有一个接受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();
    }
}

4 个答案:

答案 0 :(得分:19)

你做不到。由于类型擦除,反射将显示您有一个HashMap实例,但类型在运行时被删除。实际上,你有HashMap&lt;对象,对象&gt;。

那说,你还有一些选择,我建议你采取一些建议。其中:

  • 检查它是否是“Map”的实例而不是“HashMap”。它会使您的API更加灵活,因为您很可能只关心您是否可以通过密钥快速访问而不是任何特定的操作
  • 利用java.util.Map的api定义'containsKey(Object)'和'get(Object)',这样你仍然可以安全地使用mapInst.get(“stringKey”),即使不需要强制转换。 / LI>
  • 您不能确保所有值都是字符串,但您可以利用java.lang.Object的toString()方法,并为每个值获取一个String。

简而言之:像任何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");
    }

现在,您知道对象的类型正确 - 甚至是自定义抽象类或其他。