Как вывести элементы коллекции, типом данных которой является класс, расширяющий класс родитель, через 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
  1. Представленный "вывод" не соответствует коду в вопросе, отсутствует информация о реализации класса-родителя Box.
  2. Вся "проблема" сводится к тому, что вызывается метод toString, определённый для класса-родителя, а в классе-потомке HeavyBox он не переопределен (см. ответ Дмитрия Рихтера,).
  3. Не нужно смешивать в одном классе-контейнере метод printAllElement и метод, отмеченный аннотацией @Test, который по факту ничего не тестирует, как положено юнит-тесту.
→ Ссылка