Как вывести элементы коллекции, типом данных которой является класс, расширяющий класс родитель, через forEach
Как вывести элементы коллекции, типом данных которой является класс, расширяющий класс родителя, через forEach
?
package Collection.Ex1;
import lombok.*;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
@Getter
@Setter
public class HeavyBox extends Box {
protected Integer weight;
public HeavyBox(Double width, Double height, Double depth, Integer weight) {
super(width, height, depth);
this.weight = weight;
}
public static void printAllElement(ArrayList<HeavyBox> boxList) {
for (HeavyBox box : boxList) {
System.out.println(box);
}
}
@Test
public void test() {
ArrayList<HeavyBox> heavyBoxes = new ArrayList<>();
HeavyBox box1 = new HeavyBox(10.0, 10.0, 10.0, 17);
HeavyBox box2 = new HeavyBox(15.0, 15.0, 15.0, 25);
HeavyBox box3 = new HeavyBox(20.0, 20.0, 20.0, 35);
heavyBoxes.add(box1);
heavyBoxes.add(box2);
heavyBoxes.add(box3);
for (HeavyBox box : heavyBoxes) {
System.out.println(box);
}
System.out.println(" ");
heavyBoxes.get(0).setWeight(box1.getWeight() + 1);
HeavyBox.printAllElement(heavyBoxes);
}
}
Выводит:
Box(width=10.0, height=10.0, depth=10.0)
Box(width=15.0, height=15.0, depth=15.0)
Box(width=20.0, height=20.0, depth=20.0)
Нет переменной weight
.
Ответы (3 шт):
Автор решения: Ilya
→ Ссылка
Как итог вывод текста сделал, путем того, что переделал метод, но всё равно интересно почему не выводило последний элемент.
for (HeavyBox box : boxList) {
System.out.printf("ширина = %f, высота = %f, глубина = %f, вес = %d\n",
box.getWidth(), box.getHeight(), box.getDepth(), box.getWeight());
}
}
Автор решения: Дмитрий Рихтер
→ Ссылка
Скорее всего в Box ты установил @ToString.
Над public class HeavyBox тоже надо установить эту аннотацию и включить вызов "superToString"
@Getter
@Setter
@ToString(callSuper=true)
public class HeavyBox extends Box {
Автор решения: Nowhere Man
→ Ссылка
- Представленный "вывод" не соответствует коду в вопросе, отсутствует информация о реализации класса-родителя
Box
. - Вся "проблема" сводится к тому, что вызывается метод
toString
, определённый для класса-родителя, а в классе-потомкеHeavyBox
он не переопределен (см. ответ Дмитрия Рихтера,). - Не нужно смешивать в одном классе-контейнере метод
printAllElement
и метод, отмеченный аннотацией@Test
, который по факту ничего не тестирует, как положено юнит-тесту.