Ошибка:
...
Caused by: java.lang.ExceptionInInitializerError
...
Caused by: java.lang.ClassCastException:
class com.evopulse.ds2150.TechTrees$BuildingTechTree
not an enum
at java.util.EnumSet.noneOf(Unknown Source)
at java.util.EnumSet.of(Unknown Source)
at com.evopulse.ds2150.TechTrees$BuildingTechTree.<clinit>(TechTrees.java:38)
Вот фрагмент моего перечисления
public enum BuildingTechTree {
//Name SoftName Requirements
NONE ("NULL", null),
- > В этой следующей строке происходит сбой
BARRACKS ("Barracks", EnumSet.of(NONE),
WALLS_SANDBAGS ("Sandbag wall", EnumSet.of(NONE),
POWERPLANT ("Power plant", EnumSet.of(BARRACKS)),
GUARDTOWER ("Guard Tower", EnumSet.of(BARRACKS));
Замена EnumSet.of(NONE) и EnumSet.of(BARRACKS) на null, позволяет инициализировать работу, но прерывает мой код из-за отсутствия структуры данных... очевидно, но я сделал это, чтобы проверить остальную часть моего кода не было чем-то причиной.
Удаление EnumSet.of(NONE) и замена с помощью NONE, а также для BARRACKS, а также изменение всех связанных переменных, конструктора и методов, которые тоже не работали... (и даже не могли использовать contains.all, так как не был "применим к моей измененной переменной"...)
Я продлил этот пример, используя вторую реализацию: https://gamedev.stackexchange.com/a/25652/48573
Я также попытался восстановить мои шаги, скопировав пример дословно. добавлено
private static Set<BuildingTechTree> techsKnown;
techsKnown = (BuildingTechTree.BIODOME);
test = TechTrees.researchTech(techsKnown);
для другого класса, который должен быть вызван для проверки инициализации. и пришлось изменить
public boolean researchTech(BuildingTechTree tech) {
до статического
Это привело к ошибке "in not an enum". У меня нет комментариев, чтобы прокомментировать его ответ, чтобы указать на ошибку инициализации...
Добавлена информация для обоих текущих ответов, так как оба решения вызывают одну и ту же новую ошибку:
public class TechTrees {
private static Set<BuildingTechTree> techsKnown;
public TechTrees() {
techsKnown = EnumSet.of(BuildingTechTree.NONE); //Using this
techsKnown = EnumSet.noneOf(BuildingTechTree.class); //Or this
}
public static boolean researchTech(BuildingTechTree tech) {
if (techsKnown.containsAll(tech.requirements)) { //Causes null pointer
return true; //exception @ techsKnown
}
return false;
}