我需要从自定义类JSONObject
的{{1}}和浮点值创建HashMap
。我尝试了下面的代码,希望它能正常工作:
toString
但我明白了:
public class MyClass {
...
public String toString() {
return "a nice string"
}
}
HashMap<MyClass,Float> map = new HashMap<MyClass,Float>();
map.put(...);
JSONObject json = new JSONObject(map);
创建此java.lang.ClassCastException: MyClass cannot be cast to java.lang.String
的最佳方法是什么?感谢。
答案 0 :(得分:2)
你需要改变这个:
HashMap<MyClass,Float> map = new HashMap<MyClass,Float>();
与
HashMap<String,Float> map = new HashMap<String,Float>();
正如你所说“ 自定义类的toString和浮动值的HashMap ”
您尚未提及如何将值放入散列映射中。
但是如果您使用自定义类的toString
方法,那么您应该将其设置为:
MyClass m = new MyClass();
map.put(m.toString,123.45f);
答案 1 :(得分:1)
好像你正在使用org.json
库。如果您查看JSONObject
类的代码,显然他们没有使用泛型。
public JSONObject(Map map) {
this.map = new HashMap();
if (map != null) {
Iterator i = map.entrySet().iterator();
while (i.hasNext()) {
Map.Entry e = (Map.Entry)i.next();
Object value = e.getValue();
if (value != null) {
this.map.put(e.getKey(), wrap(value));
}
}
}
}
此地图似乎按照用于管理唯一String
键的Object
地图的外观处理带有keyPool
键和String
值的条目。在评论中,它还表示:
这由JSONObject.put(string,object)使用。
因此,假设JSON对象的键是Strings
是正确的。
您的MyClass
类型无法直接升级到String
(String
不是MyClass
的超类),这就是构造函数实际上在抱怨地图的原因,因为它需要HashMap<String,Object>
形式的地图(请注意,Float
和Object
没有问题)。
要解决此问题,您必须定义一个HashMap<String,Float>
,您应该使用String
存储MyClass
个toString
对象的代表。
如果您无法使用String
,可以考虑使用将String
代表的代码映射到某个MyClass
对象的中间结构,这样您就可以保留{ {1}}上课。
答案 2 :(得分:0)
Gamb和Abu的答案都是正确的,并帮助我得出了我的最终结果。
我解决了这个问题:
HashMap<MyClass,Float> obj = functionThatReturnsThisStructure();
JSONObject jsonObj = new JSONObject();
for (Entry<MyClass,Float> entry: obj.entrySet()) {
jsonObj.put(entry.getKey().toString(), entry.getValue());
}