Спасибо всем, кто ответил на этот вопрос.
Кажется, это действительно крутая гайка. Я закончил тем, что отказался от создания статического массива и getter в моем базовом классе.
public abstract class Animal{
private static Animal[] animals= null;
public static Animal[] getAnimals(){
if (animals==null){
animals = new Animal[]{
new Dog(),
new Cat(),
new Lion()
};
}
return animals;
}
}
Кажется, что Java просто не настроен для самонастраиваемости, как это делает C #. Я полагаю, проблема заключается в том, что, поскольку приложение Java - это всего лишь коллекция файлов .class в файле directory / jar где-то, среда выполнения не знает о классе, пока не будет упомянута ссылка. В это время загрузчик загружает его - то, что я пытаюсь сделать, это обнаружить его, прежде чем ссылаться на него, что невозможно, не выходя из файловой системы и не глядя.
Мне всегда нравится код, который может обнаружите себя вместо того, чтобы мне рассказывать о себе, но, увы, это тоже работает.
Еще раз спасибо!