Java 从对象进行类型转换
我有一些Java代码,如下所示:Java 从对象进行类型转换,java,Java,我有一些Java代码,如下所示: private Object addVertex(String label, int posX, int posY) { Vertex newVertex = new Vertex(); this.getModel().beginUpdate(); try { newVertex = insertVertex(parent, null, label, posX, posY, 80, 30); } final
private Object addVertex(String label, int posX, int posY) {
Vertex newVertex = new Vertex();
this.getModel().beginUpdate();
try {
newVertex = insertVertex(parent, null, label, posX, posY, 80, 30);
}
finally {
this.getModel().endUpdate();
}
return newVertex;
}
由于类型不匹配,该代码无法工作,insertVertex将返回一个对象,但我得到一个类型不匹配,因为它无法从对象转换到顶点(这是我创建的对象)
首先,为什么这不起作用,因为默认情况下对象顶点继承对象,所以您应该能够做到这一点
另外,如果我尝试按如下所示将对象投射到顶点
newVertex = (Vertex) insertVertex(parent, null, label, posX, posY, 80, 30);
我收到一个错误,说我无法进行转换。尝试使用
Object insertResult = insertVertex(parent, null, label, posX, posY, 80, 30);
if(insertResult instanceof Vertex){
newVertex = (Vertex)insertResult;
}
如果获得默认实现,则返回的类型不是顶点对象
insertVertex方法必须返回从顶点延伸的对象
顶点
继承自对象
,但并非相反。基本上,您正在尝试:
Object tmp = insertVertex(...);
newVertex = tmp;
无法将对象
引用指定给新顶点
,因为后者属于顶点
类型
现在,只要执行时
insertVertex
真正返回Vertex
,就可以使用您的强制转换。请详细说明您收到的错误消息。您应该能够将insertVertex的结果强制转换为任何您想要的结果。它可能在运行时失败,但如果您知道它将始终是一个顶点,那么它就不应该失败。正如Markus所建议的,您可以使用instanceof来测试这一点
另一方面,代码在创建一个新顶点并将其指定给newVertex变量时看起来很奇怪,但不将该引用传递到任何地方?您不能将对象转换为顶点实例,因为对象是顶点的超类,而不是相反
是否可以修改InsertVertex以返回顶点对象而不是对象?真的没有理由不这么做。否则,您必须通过函数手动将对象强制转换为顶点对象。您不能将水果指定给香蕉。香蕉比水果更特殊,它是水果的一个亚类。你可以做相反的事情,
Fruit f=new Banana()代码>
这就是这里正在发生的事情。如果插入顶点
返回一个对象
,则只能将其分配给另一个对象
。如果您将其强制转换为Vertex
并得到一个错误,那么您的insertVertex
方法必须声明另一种类型的对象
,它不是Vertex
的子类,所以,您可能不需要强制转换到顶点,只需将newVertex定义为一个对象。然而,看起来在任何情况下,您都需要在另一个函数中进行转换。在我看来,强制转换应该可以工作,如果不能,请发送已生成的异常。您能提供该错误吗?我假设它是一个ClassCastException,与名称“insertVertex”不同,它听起来像是一个void方法,并且会将对象插入父对象(而不是返回它)…但当然这只是一种猜测-请按照afk的要求提供更多信息。实际上,即使编译器也会拒绝它知道无法成功的强制转换,因为被强制转换的类型与被强制转换到的类型来自不同的继承层次结构。在这种情况下,编译器错误是“无法将X转换为Y”-也许这就是saralk遇到的问题。