Na razie nie wiem czy jest ShoppingList- bo generalnie, wychodzi na to że jest to typ- klasa.
A poniższy kod jest wywołaniem metody statycznej
ShoppingList.add(ingredient);
return ShoppingList;
następnie widze, że jest zwracane return ShoppingList; -> którego nie ma nawet jako parametr. ( jeśli to bylby typ interfejsu, trzeba by to rzutować na funkcyjną lambdę ).
Analizując tutaj kod podejrzewam, że ShoppingList to pole klasy- i utworzenie obiektu nie zawsze wiąże się z utworzeniem listy. Wypadałoby wrzucić cały kod klasy.
Dalej w pętli for w metodzie remove, iterujesz po elementach których nie ma
for(Ingredients element: ShoppingList)
ShoppingList - tego tutaj nie widzę, rozumiem byc może jest to POLE KLASY, którego nie dodałaś.
Nie możesz nigdzie zwracać listy, bo jej nie zwracasz. Zwracasz obiekt typu ShoppingList
public ShoppingList
a nie List<ShoppingList>.... albo List<elementy>....
Potem w obiekcie ShoppingList tworzę listę jednokierunkową, która ma przechowywać obiekty klasy ingredients
w zamieszczonym kodzie nigdzie nie tworzysz listy jednokierunkowej, ani nigdzie nie dodajesz obiektów klasy ingredients do listy , chyba że robisz to z wywołaniem metody obiektu statycznej... ale to jest niedopuszczalne dlatego, że STATYCZNA metoda add- jest częścią klasy nie obiektu, więc lista byłaby wspólna dla wszystkich obiektów typu twojej klasy. To rodzi po pierwsze błędy po drugie fakt, że z natury listy powinny być immutable- samo final tego nie zapewni, tzn referencja będzie niemutowalna, jednak wartości listy mogą być zmienne.