EnumSet.copyOf пустой коллекции создает исключение IllegalArgumentException - PullRequest
3 голосов
/ 30 апреля 2019

У меня есть код ниже, который завершается с IllegalArgumentException

public EnumSet<test> getData(){  // Line 1
   return EnumSet.copyOf(get(test))) // Line 2
}



private Collection<Test> get(Test[] test){  //Line 1
 test= test==null ? new Test[0] : test;     // line 2
 return Array.asList(test) //Line 3
}

, если test равен нулю, тогда строка 2 функции get создает пустой массив Test и EnumSet.copyOf(get(test)) throws IllegalArgumentException

Я не понимаю, почему выбрасывается это исключение?

1 Ответ

3 голосов
/ 30 апреля 2019

EnumSet использует некоторое отражение, чтобы идентифицировать тип своих элементов. (Набор использует "порядковый номер" значений enum для отслеживания того, включен ли каждый элемент.)

Когда вы создаете EnumSet с copyOf(Collection), он проверяет, является ли коллекция EnumSet. Если это так, он использует тот же тип, что и исходный набор. В противном случае он пытается вызвать getClass() для первого элемента в исходной коллекции. Если коллекция пуста, то нет первого элемента и нечего запрашивать его класс. Таким образом, в этом случае происходит сбой («throws IllegalArgumentException, если c не является экземпляром EnumSet и не содержит элементов»).

Чтобы создать пустой EnumSet, вам нужно самостоятельно определить класс и использовать noneOf().

Collection<Test> tests = get(test);
return tests.isEmpty() ? EnumSet.noneOf(Test.class) : EnumSet.copyOf(tests);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...