<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。
这是我在这里发布的第一个问题。由于你们已经回答了很多问题,而且通常我都能找到答案,这要感谢 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。