2015-09-22 3 views
1

Мне нужно создать EnumSet из набора. Я решил использовать метод EnumSet#copyOf. Однако из-за ограничений по этому методу:Java: EnumSet.copyOf - есть ли место для улучшения?

the specified collection must contain at least one element (in order to determine the new enum set's element type) 

Мне нужно убедиться, что коллекция не пуста. Код становится:

enum Color {RED, GREEN, BLUE}; Set<Color> set = ... // get it from somewhere if (set.isEmpty()) { return EnumSet.noneOf(Color.class); else return EnumSet.copyOf(set);

Возможно, есть реальное ограничение на JAVAC, чтобы определить правильный тип элементов коллекции передается copyOf метод, но я не могу отделаться от ощущения, что я должен прибегать к чему-то подобному выше, чтобы удовлетворить пустую коллекцию. Вот мои вопросы:

  1. В чем именно ограничение, которое пустая коллекция не может быть принята здесь?

  2. Был ли метод подписи, такой как copyOf(Collection<Enum<E>>), решить эту проблему?

  3. Если да, то какие другие проблемы он создал?

ответ

0

Глядя на исходный код EnumSet, я вижу две причины требуют, по крайней мере, один элемент для copyOf(Collection):

  • enum класс проверяется число возможных enum значений. Этот номер используется для определения того, какая реализация используется: RegularEnumSet использует биты в одном long, чтобы отметить содержащиеся элементы (допускающие до 64 значений), JumboEnumSet использует массив long[] (long).
  • Тип элемента хранится и используется для проверки типа времени выполнения (например, метод add(E) в подклассах вызывает EnumSet.typeCheck(E), который может вызывать ClassCastException). Это кажется необходимым из-за стирания типа.

бы метод подписи, как copyOf(Collection<Enum<E>>) решил эту проблему?

подпись уже в основном то, что вы предлагаете, просто с другим синтаксисом:

public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) 

Здесь E определяется как <E extends Enum<E>>, что означает Collection<E> некоторый тип Collection<Enum<E>>.