类型<string,string>的Hashtable正在存储<string,integer =“”>类型值,正如我在log cat和debugger中看到的那样。可能吗?

时间:2015-07-21 20:43:57

标签: java android hashtable

这是我在这里发帖的第一个问题。既然你们已经回答了这么多问题,我一般会找到答案,感谢stackoverflow。 所以具体到我的问题 - 我有一个Hastable类型的静态<String,String>。当我从其他一些活动中设置值和键时,在某些特定情况下(我不确定是这种情况),我的Hastable的数据类型为<String, Integer>。我在调试器中检查它也显示相同。我犯了什么错误,请有人帮我指点问题吗? 感谢。

修改 这是我的代码 -

       Hashtable<String,String> details;
        details= new Hashtable<>();
        Hashtable temp;
        temp = details;
        temp.put("key1", new Integer("1"));
        temp.put("key2", "1");
        Log.d("details", details.get("key1"));//Causes ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        Log.d("temp",temp.get("key1").toString());//No issue ,worked

2 个答案:

答案 0 :(得分:4)

  

Hashtable<String,String>包含<String, Integer>类型的值

是的,这是可能的。 Hashtable的实际运行时类型使用Object作为键和值类型。 (更长时间的解释Google&#34; java类型擦除&#34; ...)

例如,当你写这个:

 Hashtable<String, String> tab = new Hashtable<>();
 tab.put("A", "B");
 String res = tab.get("A");

最后一句话实际上是在幕后做这件事:

 String res = (String) tab.get("A");

如果您按照规则玩过,那么类型转换就永远不会失败。

  

我有什么错误可以帮助我指出问题吗?

如果没有看到您的代码我们只能猜测,但一种可能的解释是您忽略(或禁止)了一个关键的&#34;未经检查的转换&#34;警告或类似。例如:

 Hashtable<String, Integer> tab = new Hashtable<>();
 tab.put("A", new Integer(42));

 // Unchecked conversion
 Hashtable<String, String> bad = (Hashtable<String, String>) tab;

 String res = bad.get("A");    // Ooops!

您永远不应该忽略编译器警告。有时压制它们是安全的,但你真的需要理解它们的意思来做出判断。如果你在没有适当考虑的情况下压制它们,你就有可能编写错误的代码,在异常的地方抛出ClassCastException。

答案 1 :(得分:1)

在Java中,使用类型擦除来实现泛型。

Hashtable能够存储任何类型的键和值。所以在理论上它是可能的。 IDE可能会根据实际值猜测类型。