2013-09-26 2 views
1

Я пытаюсь создать массив EnumSet (используя Eclipse).Создание массива EnumSet в Java

Версия 1:

EnumSet mySet[] = new EnumSet[3]; 

Это работает, но я получаю предупреждение: «EnumSet является сырьевым типом Ссылка на общий тип EnumSet должна быть параметризованной.».

Версия 2 как было предложено:

EnumSet<MyEnum> mySet[] = new EnumSet[3]; 

Опять предупреждение: "Тип безопасности: Выражение типа EnumSet [] потребности неконтролируемого преобразования, чтобы соответствовать EnumSet []"

версии 3, как предложено:

EnumSet<MyEnum> mySet[] = new EnumSet<MyEnum>[3]; 

Теперь я получаю сообщение об ошибке! «Невозможно создать общий массив EnumSet»

Что мне делать? Будет ли не параметризованный EnumSet иметь проблемы с производительностью?

+0

Любопытно: почему массив, а не коллекция, такие как 'List >'? –

ответ

2

Вы не можете создать массив конкретного параметризованного типа, поскольку он не является безопасным по типу. Причина в том, что конкретный параметризованный тип не подтверждается, тогда как массивы являются сущностью.

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

EnumSet<?> mySet[] = new EnumSet<?>[3]; 

причина, почему это происходит потому, что rawtypes и неограниченные типы подстановочных являются овеществлённая. Таким образом, для типов массивов с таким типом компонентов существует тип typeafe.

Под эгидой мы подразумеваем, что информация о типе доступна во время выполнения. Это не соответствует конкретному параметризованному типу, поскольку информация о типе теряется как процесс стирания типа. Однако для сырых типов нет никакого типа, который может быть потерян. То же самое верно для <?> типов. Так как EnumSet<?> является супертипом всего экземпляра родового типа EnumSet<T>, поэтому в момент компиляции не существует информации о типе информации о EnumSet<?>, который может быть потерян во время выполнения.

Другой вариант - просто создать список. Это гораздо лучше, чем смешивание массивов с общими типами:

List<EnumSet<MyEnum>> mySets = new ArrayList<>(); 
+0

Это действительно работает. Однако, возможно, мне лучше использовать двумерный ArrayList. \t \t статический список > mySets = новый ArrayList >() { \t \t \t частный статический окончательный длинный serialVersionUID = 8665476113647893645L; \t \t \t { \t \t \t \t // добавить наборы \t \t \t \t добавить (EnumSet.of (А, В, С)); \t \t \t \t add (EnumSet.из (D, Е, F, G)); \t \t \t} \t \t}; –

 Смежные вопросы

  • Нет связанных вопросов^_^