Тип приведения из объекта - PullRequest
0 голосов
/ 17 июля 2009

У меня есть некоторый код в 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 вернет объект, но я получаю несоответствие типов, так как он не может преобразовать из объекта в вершину (это созданный мной объект).

Во-первых, почему это не может работать, поскольку объект Vertex наследует Object по умолчанию, несомненно, вы должны это сделать.

Кроме того, если я попытаюсь ввести объект в Vertex следующим образом

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

Я получаю сообщение о том, что не могу выполнить это преобразование.

Ответы [ 7 ]

3 голосов
/ 17 июля 2009

Vertex наследуется от Object, но не наоборот. В основном вы пытаетесь сделать:

Object tmp = insertVertex(...);
newVertex = tmp;

Нельзя присвоить ссылку Object для newVertex, поскольку последняя имеет тип Vertex.

Теперь с вашим приведением должно быть в порядке, пока insertVertex действительно возвращает Vertex во время выполнения. Пожалуйста, укажите точно какое сообщение об ошибке вы получаете.

1 голос
/ 17 июля 2009

Вы не можете назначить фрукт банану. Банан более специфичен, чем Фрукт, это подкласс Фрукта. Вы можете сделать наоборот, Fruit f = new Banana();

Это то, что здесь происходит. Если ваш insertVertex возвращает Object, он может быть назначен только другому Object. Если вы приведете его к Vertex и получите ошибку, тогда ваш метод insertVertex должен объявить другой тип Object, который не является подклассом Vertex.

1 голос
/ 17 июля 2009

Вы не можете конвертировать Object в экземпляр Vertex, потому что Object является суперклассом Vertex, а не наоборот.

Можете ли вы изменить InsertVertex, чтобы он возвращал объект Vertex вместо Object? Там действительно нет причин, чтобы не. В противном случае вам придется вручную привести объект к объекту вершины с помощью функции.

1 голос
/ 17 июля 2009

Вы должны иметь возможность привести результат insertVertex к чему угодно. Он может потерпеть неудачу во время выполнения, но если вы знаете, что это всегда будет вершина, тогда он не должен потерпеть неудачу. Как предполагает Маркус, вы можете использовать instanceof для проверки этого.

Кроме того, код выглядит странно, когда вы создаете новую вершину и присваиваете ее переменной newVertex, но затем никуда не передаете эту ссылку?

1 голос
/ 17 июля 2009

Попробуйте использовать

Object insertResult = insertVertex(parent, null, label, posX, posY, 80, 30);
if(insertResult instanceof Vertex){
   newVertex = (Vertex)insertResult;
}

Если вы получаете реализацию по умолчанию, возвращаемый тип не является объектом Vertex.

Метод insertVertex должен возвращать объект, который выходит из вершины!

0 голосов
/ 17 июля 2009

Нет необходимости создавать новую вершину только для инициализации переменной.

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

[]] * * 1 010

0 голосов
/ 17 июля 2009

Хорошо для определения функции выглядит, что вы хотите вернуть Object, поэтому, вероятно, вам не нужно приводить к Vertex и просто определять newVertex как Object. Однако, похоже, что в любом случае вам нужно будет выполнить приведение в другой функции. Мне кажется, что приведение должно сработать, и если нет, отправьте исключения, которые были сгенерированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...