#java #cannot-find-symbol
Вопрос:
Проблема
Я пытаюсь создать простой Suitcase
класс, который обертывает некоторые Item
s, которые имеют a weight
.
Я создал getTotalWeight()
метод, и теперь я хочу вызвать его в своем toString
методе, но я получаю:
не удается найти символ
по моему утверждению this.items.getTotalWeight()
в toString
методе. Почему? Что я делаю не так?
Код
Вот код:
Item.java
public class Item { private int weight; private String name; public Item(String name, int weight) { this.name = name; this.weight = weight; } public String toString() { return this.name " (" this.weight ")"; } public int getWeight() { return this.weight; } }
Suitcase.java
import java.util.ArrayList; public class Suitcase { private ArrayListlt;Itemgt; items; public Suitcase() { this.items = new ArrayListlt;gt;(); } public void addItem(Item item) { this.items.add(item); } public int getTotalWeight() { int totalWeight = 0; for (Item item : items) { totalWeight = item.getWeight(); } return totalWeight; } public String toString() { if (this.items.size() == 1) { return this.items.size() " item (" this.items.getTotalWeight() " kg)"; } else { return this.items.size() " items (" this.items.getTotalWeight() " kg)"; } } }
Ответ №1:
Объяснение
Это справедливо this.getTotalWeight()
или справедливо getTotalWeight()
. Метод принадлежит вашему Suitcase
классу (вашему this
в контексте), а не тому items
, который относится к типу ArrayList
.
Так что исправьте это, чтобы:
public String toString() { if (this.items.size() == 1) { return this.items.size() " item (" this.getTotalWeight() " kg)"; } else { return this.items.size() " items (" this.getTotalWeight() " kg)"; } }
Кроме того, пожалуйста, никогда не забывайте добавлять @Override
, когда вы переопределяете методы (например, toString
), это дает вам дополнительную помощь компилятора.
Упрощения
При этом вы можете немного упростить код, например так:
@Override public String toString() { String itemText = items.size() == 1 ? "item" : "items"; return "%d %s (%d kg)".formatted(items.size(), itemText, getTotalWeight()); }
Ключевыми изменениями являются:
- избавляясь от дублирования кода, ветвление должно содержать только ту часть, которая действительно изменяется (т. Е.
item
vsitems
) - использование троичного для удобства чтения вместо if-else
- использование форматированных строк для удобства чтения
- удаление устаревших
this.
префиксов - добавление
Override