<String,String> 类型的哈希表正在存储 <String, Integer> 类型的值,正如我在日志猫和调试器中看到的那样。可能吗?

Hashtable of type <String,String> is storing <String, Integer> type value as I see in the log cat and debugger. Is it possible?

这是我在这里发布的第一个问题。由于你们已经回答了很多问题,而且通常我都能找到答案,这要感谢 Whosebug。 所以针对我的问题- 我有一个类型为 <String,String> 的静态 Hastable。当我从其他 activity 设置值和键时,在某些特定情况下(我不确定这种情况)我的 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

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

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

Can a Hashtable of type <String,String> contains value of type <String, Integer>

是的,这是可能的。 Hashtable 的实际运行时类型使用 Object 作为键和值类型。 (更详细的解释 Google "java type erasure" ...)

例如,当你这样写时:

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

最后一条语句实际上是在幕后进行的:

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

如果你遵守规则,那么类型转换永远不会失败。

What mistake I have made can anyone please help me pointing the issues?

在没有看到您的代码的情况下,我们只能猜测,但一种可能的解释是您忽略(或抑制)了严重的 "unchecked conversion" 警告或类似警告。例如:

 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。