我在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);
}
finally {
this.getModel().endUpdate();
}
return newVertex;
}
由于类型不匹配,该代码无法工作,insertVertex将返回一个Object,但由于无法将Object转换为Vertex(这是我创建的对象),因此导致类型不匹配。
首先,为什么不起作用,因为Vertex默认继承Object的对象肯定你应该能够做到。
另外,如果我尝试按如下方式将对象强制转换为顶点
newVertex = (Vertex) insertVertex(parent, null, label, posX, posY, 80, 30);
我收到错误消息,说我无法进行转换。
答案 0 :(得分:3)
Vertex
继承自Object
,但不是相反。基本上你是想做的:
Object tmp = insertVertex(...);
newVertex = tmp;
您无法为Object
分配newVertex
引用,因为后者的类型为Vertex
。
现在,只要insertVertex
在执行时真正返回Vertex
,你的演员就应该没问题。请详细说明正好您收到的错误消息。
答案 1 :(得分:1)
尝试使用
Object insertResult = insertVertex(parent, null, label, posX, posY, 80, 30);
if(insertResult instanceof Vertex){
newVertex = (Vertex)insertResult;
}
如果获得默认实现,则返回的类型不是Vertex对象。
insertVertex方法必须返回一个从Vertex扩展的Object!
答案 2 :(得分:1)
您应该能够将insertVertex的结果转换为您想要的任何内容。它可能在运行时失败,但如果你知道它将始终是一个顶点,那么它不应该失败。正如Markus建议的那样,你可以使用instanceof来测试它。
顺便说一句,代码看起来很奇怪你创建一个新的顶点并将它分配给newVertex变量,但是然后不在任何地方传递该引用?
答案 3 :(得分:1)
你无法将Object转换为Vertex的实例,因为Object是Vertex的超类,而不是相反。
您可以修改InsertVertex以返回Vertex对象而不是Object吗?真的没有理由不这样做。否则,您必须通过函数手动将Object转换为Vertex对象。
答案 4 :(得分:1)
你不能将水果分配给香蕉。香蕉比水果更具体,它是水果的子类。你可以这样做,Fruit f = new Banana();
这就是这里发生的事情。如果您的insertVertex
返回Object
,则只能将其分配给其他Object
。如果您将其强制转换为Vertex
并且收到错误,那么您的insertVertex
方法必须声明另一种类型Object
不是Vertex
的子类。
答案 5 :(得分:0)
因为函数的定义看起来你想要的是返回Object,所以可能你不需要转换为Vertex并且只需将newVertex定义为Object。但是看起来在任何情况下你都需要在另一个函数中进行转换。听起来演员应该有效,如果没有,请发送已经产生的例外情况。
答案 6 :(得分:0)
无需仅为初始化变量创建新的Vertex。
Vertex newVertex;
如果您不在方法中使用newVertex,则可以将其声明为Object。
Object newVertex;
或者只是从insertVertex
返回结果(如果有的话)private Object addVertex(String label, int posX, int posY) {
Vertex newVertex = new Vertex();
this.getModel().beginUpdate();
try {
return insertVertex(parent, null, label, posX, posY, 80, 30);
}
finally {
this.getModel().endUpdate();
}
}
[]]