2013-06-06 2 views
1

У меня возникли проблемы с переносом объекта в связанный список. Вот код:Передача объекта из разных классов Java

if(runTypes[k]==EMPTY){ 
     Empty creature = new Empty(); 
    } 
else if(runTypes[k]==FISH){ 
      Fish creature = new Fish(); 
     } 
else if (runTypes[k]==SHARK){ 
      Shark creature = new Shark(starveTime); 
     } 
DLinkedList.insertEnd(creature,runLengths[k]); 

Однако я получаю сообщение об ошибке:

RunLengthEncoding.java:89: cannot find symbol 
symbol : variable creature 
location: class RunLengthEncoding 
     DLinkedList.insertEnd(creature,runLengths[k]); 
          ^
1 error 

Empty() является супер класс для рыб и акул.

Вот код для метода insertEnd в циркулярно класса LinkedList:

public void insertEnd(Empty creature, int number) { 
    DListNode3 node = new DListNode3(creature); 
    head.prev.next = node; 
    node.next = head; 
    node.prev = head.prev; 
    head.prev=node; 
    node.amount = number; 
    size++; 
} 

А вот код для узла: общественного класса DListNode3 {

public Empty creature; 
    public DListNode3 prev; 
    public DListNode3 next; 
    public int amount; 

    DListNode3(Object creature) { 
     this.creature = creature; 
     this.amount = 1; 
     this.prev = null; 
     this.next= null; 
    } 

    DListNode3() { 
     this(null); 
     this.amount = 0; 
    } 
    } 

Я не знаю, что делать, и я новичок в ООП. Любой совет?

+1

Я думаю, вы столкнулись объем переменной задачи (HTTP [Что подразумевается под Scope переменной?]: //programmers.stackexchange. com/questions/141133/what-is-mean-by-scope-of-a-variable) – Smit

+2

'creature' не работает, когда вы пытаетесь его использовать. Вам нужно объявить переменную за пределами 'if', а затем назначить ее в if. – gparyani

+0

Как заявили другие, у вас есть проблема с объемом ваших переменных. Как только вы это поймете, обязательно проверьте, какие объекты вы хотите добавить в свой список. Похоже, вы хотите добавить объекты 'Empty',' Shark' и 'Fish'. Однако ваш метод 'insertEnd()' позволяет добавлять объекты 'Empty'. –

ответ

3

Когда мы объявляем переменную следующим образом -

if(runTypes[k] == EMPTY) { 
     Empty creature = new Empty(); 
} 

переменная является локальной для блока ({}), внутри которой она объявлена. И это не видно за пределами этого блока.

И вы пытаетесь использовать его вне -

DLinkedList.insertEnd(creature,runLengths[k]); 

, где он не виден. Итак, компилятор жалуется.

Вы можете сделать что-то, как следует решить эту проблему -

Empty creature = null; //Empty can be the variable type, it's the parameter type in the insertEnd method 
if(runTypes[k] == EMPTY) { 
    creature = new Empty(); //no problem, it's the same class 
} else if(runTypes[k] == FISH) { 
    creature = new Fish(); //no problem, Fish is a subclass 
} else if (runTypes[k] == SHARK) { 
    creature = new Shark(starveTime); //no problem, Shark is a subclass of Empty 
} 
DLinkedList.insertEnd(creature, runLengths[k]); 
+2

Это предлагаемое решение представляет новую проблему: три отдельные переменные с тем же именем. Я сомневаюсь, что это решит проблему OP, связанную с добавлением объектов списка, созданных из разных классов. –

+0

Редактировал оригинальную версию, но мне пришлось уйти посередине :(Но теперь это исправлено. –

+0

Нет проблем. Я все-таки не спустил вниз, так как вы * делаете * адресуете ошибку компилятора. : классы 'Empty',' Fish' и 'Shark' не заданы OP, поэтому мы не знаем, будет ли компиляция' creature = new Fish() '. –

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