2013-11-21 6 views
3

У меня есть класс LString (класс связанного списка), который работает с моим другим классом Node. Я написал метод toUppercase(), который пересекает последовательность символов и преобразует строчные буквы в верхний регистр.Ошибка возвращаемого типа связанного списка toUppercase метод

Моя проблема - тип возврата, проблема, которую я, кажется, испытываю при кодировании. Я не уверен, как вернуть требуемый тип LString, так как даже если я нахожу return LString, он распознает его как переменную и дает те же ошибки несовместимых типов.

Здесь явная ошибка:

LString.java:134: error: incompatible types 
     return current; 
      ^
    required: LString 
    found: Node 

Как вернуть этот необходимый тип LString в моем методе?

Я довольно новичок в Java, и получение информации о типах возврата показалось мне неприятным при написании этого. Дайте мне знать, должен ли я опубликовать весь свой класс. Если мой вопрос немного неясен, дайте мне знать, я хотел бы быть кратким с пользователями на этом форуме.

В соответствии с запросом здесь приведено больше кода, в котором указаны декларации, которые я сделал в обоих классах.

Моего узел Класс:

 public class Node{ 
     public char data; 
     public Node next; 

     //constructors from page 956 
     public Node() 
     { 
      this('\0',null); //'\0' is null char for java 
     } 

     public Node(char initialData, Node initialNext) 
     { 
      data = initialData; 
      next = initialNext; 
     } 
} 

И мой LString класс (только конструктор и мой метод toUppercase я перечислю):

public class LString{ 

    private Node front = null; //first val in list 
    private Node back; //last val in list 
    private int size = 0; 
    private int i; 

    public LString(){ 
     //construct empty list 
     Node LString = new Node(); 
     front = null; 

    } 
    public LString toUppercase(){ 
     Node current = front; 
     while(current != null){ 
     current.data = Character.toUpperCase(current.data); 
     current = current.next; 
     } 
     return front; 
    } 
} 

Если мне нужно предоставить больше информации, дайте мне знать.

+0

Вы должны уточнить, что вы имеете в виду: «У меня есть класс под названием LString, который работает с моим другим классом Node». Как они «работают» вместе? Каковы отношения между ними? –

+0

@ ÓscarLópez Мой класс LString - это связанный список, который ссылается на мой класс Node. Мой класс node используется для инициализации односвязного узла. Вы хотите, чтобы я опубликовал любой класс или оба? – AOE

+0

Да, необходимо, чтобы вы опубликовали объявление обоих классов (не все из них, в частности, удалили методы, которые не имеют отношения к этому вопросу), в противном случае вопрос не ясен –

ответ

1

Чтобы вернуть требуемый LString просто сделать:

return this; 

Поскольку LString класс, который содержит первый узел, связанный список, и все методы, которые модифицируют список должны просто вернуть его. Также обратите внимание, что эта линия не делает ничего в конструкторе, вы можете удалить его:

Node LString = new Node(); 
+0

Единственная проблема - нам дан этот конкретный метод LString toUppercase. В противном случае я полностью изменил бы свой возвращаемый тип в объявлении метода. – AOE

+0

@AOE, то, пожалуйста, ответьте на мой комментарий выше в вопросе –

+0

Ничего, я не знал, что вы просто можете просто использовать «это», чтобы вернуть тип в объявлении метода. Спасибо! – AOE

1
public LString toUppercase(){ 
     Node current = front; 
     while(current != null){ 
     current.data = Character.toUpperCase(current.data); 
     current = current.next; 
     } 
     return front; 
} 

front имеет тип Node, но подпись метода public LString toUppercase(), что означает, что он должен вернуть пример LString.

Подумайте, что это такое, что вы фактически хотите вернуться. Вы хотите вернуть LString, который содержит прописные буквы, не так ли? Но это уже тот случай, с которым вы работаете! Таким образом, вы можете либо вернуться this:

public LString toUppercase(){ 
     Node current = front; 
     while(current != null){ 
     current.data = Character.toUpperCase(current.data); 
     current = current.next; 
     } 

     return this; 
} 

Но в этом случае вам все равно нужен другой метод, который печатает символы верхнего регистра:

LString lString = new LString(); 
... 
... 
lString.toUppercase(); //lString is already modified and contains uppercase characters! You 
         //don't have to "return" anything. If you returned "this" this 
         //line would be lString = lString.toUppercase(), but that's 
         //not buying you anything special. 
System.out.println(lString.toString()); //Assuming you have a toString method 
             //that prints out the characters. 

При вызове метода toUppercase экземпляра вы уже изменили свой LString поэтому нет необходимости возвращать что-либо.

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