Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的Downcast_Java - Fatal编程技术网

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”);}
除了明显的打字错误之外,你所描述的应该可以正常工作。你能给我们展示更多的代码吗,这样我们就能发现你的错误吗?@Unihedron
new 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>();