从对象中键入强制转换

时间:2009-07-17 11:13:02

标签: 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);
    }
    finally {
        this.getModel().endUpdate();
    }
    return newVertex;
}

由于类型不匹配,该代码无法工作,insertVertex将返回一个Object,但由于无法将Object转换为Vertex(这是我创建的对象),因此导致类型不匹配。

首先,为什么不起作用,因为Vertex默认继承Object的对象肯定你应该能够做到。

另外,如果我尝试按如下方式将对象强制转换为顶点

newVertex = (Vertex) insertVertex(parent, null, label, posX, posY, 80, 30);

我收到错误消息,说我无法进行转换。

7 个答案:

答案 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();
    }
}

[]]