这是我在这里发帖的第一个问题。既然你们已经回答了这么多问题,我一般会找到答案,感谢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
答案 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可能会根据实际值猜测类型。