Собственно код задачи:
public class Solution {
    public static LittleRedRidingHood hood = new LittleRedRidingHood();
    public static Grandmother grandmother = new Grandmother();
    public static Patty patty = new Patty();
    public static Woodman woodman = new Woodman();
    public static Wolf wolf = new Wolf();

    public static void main(String[] args) {

    }

    //красная шапочка
    public static class LittleRedRidingHood extends StoryItem {
    }

    //бабушка
    public static class Grandmother extends StoryItem {
    }

    //пирожек
    public static class Patty extends StoryItem {
    }

    //дровосек
    public static class Woodman extends StoryItem {
    }

    //волк
    public static class Wolf extends StoryItem {
    }

    public static abstract class StoryItem {
        public ArrayList<StoryItem> killed = new ArrayList<StoryItem>();
        public ArrayList<StoryItem> ate = new ArrayList<StoryItem>();
    }
}
Возникает ряд вопросов: 1. Почему дженерики killed и ate могут в себе хранить объекты других классов?
public ArrayList<StoryItem> killed = new ArrayList<StoryItem>();
public ArrayList<StoryItem> ate = new ArrayList<StoryItem>();
Ведь судя по коду, хранить в них можно объекты только класса StoryItem, но в действительно хранить там можно все объекты других созданных классов. По какой причине это происходит? 2. Почему при изменении доступа у обоих дженериков с public на private, уже не получится что-то в них добавить, обращаясь к ним через статичные переменные (да и не через статичные тоже) наших персонажей, НО при этом, если у классов наших персонажей прописать эти джененрики с тем же приватным доступом, то проблем не возникает? Выходит extends (расширение) не возымеет эффекта (к ним невозможно будет обратиться), если поля класса имеют приватный доступ?