2009-07-17 2 views
0

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

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

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

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

Я получаю ошибку о том, что я не могу сделать это преобразование.

+3

Можете ли вы предоставить эту ошибку? Я предполагаю, что это ClassCastException –

+0

от имени «insertVertex», похоже, что этот метод является методом void и будет вставлять объект в родительский (вместо его возврата) ... но, конечно, это просто дикая спекуляция - пожалуйста, предоставьте больше информация как афк спрашивает. – Chii

ответ

3

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

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

Вы не можете назначить Object ссылку на newVertex, поскольку последний имеет тип Vertex.

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

1

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

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

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

Метод insertVertex должен вернуть объект, который простирается от вершины!

1

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

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

+0

На самом деле, даже компилятор будет отклонять броски, которые, как он знает, не могут быть успешными, потому что тип, который создается, отличается от другой иерархии наследования, чем тип, на который он выполняется. Ошибка компилятора: «Невозможно использовать X для Y» в этом случае - возможно, это то, что встречается с saralk. –

1

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

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

1

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

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

0

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

0

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

Vertex newVertex; 

, если вы не используете newVertex в методе, вы можете объявить его как объект.

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

[]]

Смежные вопросы