Ошибка возврата типа связанного списка в метод верхнего регистра
У меня есть класс с именем LString (класс связанного списка), который работает с моим другим классом Node. Я написал метод toUppercase(), который пересекает последовательность символов и преобразует строчные в прописные.
Моя проблема - тип возвращаемого значения, проблема, которую я, похоже, испытываю, когда много пишу. Я не уверен, как вернуть требуемый тип LString, так как даже если я наберу return LString
он распознает его как переменную и выдает те же несовместимые типы ошибок.
Вот явная ошибка:
LString.java:134: error: incompatible types
return current;
^
required: LString
found: Node
Как мне вернуть этот обязательный тип LString в моем методе?
Я довольно новичок в Java, и мне было сложно разобраться в типах возвращаемых данных. Дайте мне знать, если я должен опубликовать весь мой класс. Если мой вопрос немного неясен, дайте мне знать, я хотел бы быть кратким с пользователями на этом форуме.
В соответствии с просьбой, здесь приведен мой код, который определяет объявления, которые я сделал в обоих классах.
Мой класс Node:
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;
}
}
Если мне нужно предоставить больше информации, дайте мне знать.
2 ответа
Чтобы вернуть необходимый LString
просто сделайте:
return this;
Так как LString
это класс, который содержит первый узел связанного списка, и все методы, которые изменяют список, должны просто возвращать его. Также обратите внимание, что эта строка ничего не делает в конструкторе, вы можете удалить ее:
Node LString = new Node();
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
Например, нет необходимости возвращать что-либо.