java中的Downcast
我有两门课:java中的Downcast,java,Java,我有两门课: public class Parent{ /* Some Code */ } public class Child1 extends Parent{ /* Some Code */ } public class Child2 extends Parent{ /* Some Code */ } 我有一个HashMap。使用com.google.gson.gson我已将此HashMap转换为Json: HashMap <String, Parent>
public class Parent{
/* Some Code */
}
public class Child1 extends Parent{
/* Some Code */
}
public class Child2 extends Parent{
/* Some Code */
}
我有一个HashMap
。使用com.google.gson.gson
我已将此HashMap转换为Json:
HashMap <String, Parent> criterias = new HashMap <String, Parent>();
Gson gson = new Gson();
Type listOfTestObject = new TypeToken<HashMap<String, parent>>(){}.getType();
String dataCriteria = gson.toJson(criterias, listOfTestObject);
是否有向下转换的解决方案?如果对象是使用类型父对象创建的,则无法按照建议的方式向下转换(虽然这也意味着
instanceof
将返回false,因为如果对象是instanceof
Child1
,则在对Child1进行强制转换时不会得到ClassCastException
)
一个简单的解决方案是在父类中创建一个构造函数,该构造函数接受父对象,并从本质上克隆它(复制您感兴趣的所有字段)。然后您只需重写子类中的构造函数并调用super(父类)
请注意,这不是超级内存效率,因此,如果此代码将在一个包含数百万个条目的大循环中运行,则它并不理想,但运行得非常好。如果您声明您的
映射,请在我的注释中展开,如下所示
Map<String , ? super Parent> map = new HashMap<String,Parent>();
Map Map=newhashmap();
你可以
- 添加
Parent
、Child1
和Child2
值:
map.put(“key”,new Child1());
- 检索这些并根据需要进行强制转换
Child c1=(Child1)map.get(“key”);
map声明的泛型部分应理解为:将父类
或具有父类
的任何内容作为超类
希望有帮助
干杯,听起来像是用
来代替的例子?给我们看看instanceof
的代码部分和实际演员阵容。@荒谬的想法:如果(map.get(“SomeKey”)instanceof Child1){Child1 mc=(Child1)map.get(“SomeKey”);}
除了明显的打字错误之外,你所描述的应该可以正常工作。你能给我们展示更多的代码吗,这样我们就能发现你的错误吗?@Unihedronnew Type()
告诉我这个错误:构造函数TypeToken()不可见
+1,尽管如果你映射了。put(“key”),这个解决方案可能仍然不起作用,new Parent();子c1=(Child1)map.get(“键”);我不确定这是否是Gson在幕后所做的事情?我想在OP发布他的演员代码之前,很难知道确切的问题是什么thrown@Matt你当然是对的。我只是想指出方向,因为OP-正如你所说-遗漏了他问题的核心部分。。。
java.lang.ClassCastException: Parent cannot be cast to Child1
Map<String , ? super Parent> map = new HashMap<String,Parent>();