2016-10-05 2 views
3

У меня есть эти два Перечисления объявлены таковые:Instantiate EnumSet от одного из двух типов Enum

public enum EnumOne implements EnumInterface { 
    SomethingHere, 
    SomethingThere; 
    public void someMethod() { } 
} 

public enum EnumTwo implements EnumInterface { 
    SomethingOverYonder; 
    public void someMethod() { } 
} 

Как видно здесь, оба они реализуют этот интерфейс.

public Interface EnumInterface { 
    someMethod(); 
} 

У меня есть класс, определенный здесь, который содержит EnumSet, который будет получать все элементы из любого enum1 или Enum2. Это будет определено с помощью метода, который имеет индекс как параметр. Что-то вроде этого:

public class SomeClass { 
    private EnumSet someEnum; 
    public void setEnumType (int index) { 
     switch (index) { 
     case 1: 
      someEnum = EnumSet.allOf(EnumOne.class); 
      break; 
     case 2: 
      someEnum = EnumTwo.allOf(EnumTwo.class); 
      break; 
     } 
    } 
} 

Теперь я знаю, что я должен использовать дженерики для достижения этой цели как-то, но я не знаю, как сделать это точно, так как я не достаточно хорошо знаком с ним, и я надеюсь, вы можете немного просветить меня.

Заранее благодарим за ответы.

+0

Btw enum не может использоваться как имя переменной. – Mordechai

+0

@MouseEvent Спасибо за примечание, я отредактирую это, хотя идея того, что я хочу делать, все равно натолкнулась на все, что я думаю. – ShadowGeist

+0

Если позже вы хотите использовать специальные методы EnumSet, это не сработает, поскольку у вас не может быть подходящего параметра типа для вашего объявления 'someEnum'. Если вы просто используете его как 'Set', то просто' Set someEnum = new HashMap <> (EnumSet.allOf (EnumOne.class)); '. Тем не менее, я считаю, что это принципиально неправильно в дизайне ... Вы можете сказать нам, почему вы хотите сделать что-то вроде этого –

ответ

1

Неясно, что вы ищете, но если вы просто хотите someEnum не быть объявлен с сырым типом , это работает:

+0

Я хочу, чтобы EnumSet принимал все значения одного Enum или другого в зависимости от того, что требует пользователь. В предыдущем комментарии я заявил, что проект, над которым я работаю, заключается в продаже пользователю различных видов мебели. Мебель изготовлена ​​из меламиновой или пальцевой древесины. Пользователь решает, из какого дерева мебель изготовлена. Эти две перечисления предназначены для описания этих двух типов древесины. – ShadowGeist

0

Это, как я это сделал:

public class SomeClass {                                     

    private EnumSet<? extends EnumInterface> someEnum;                              

    // I control it, so it's checked                                  
    @SuppressWarnings("unchecked")                                   
    public <E extends Enum<E> & EnumInterface> void setEnumType(int index) {                        
     switch (index) {                                     
     case 1:                                       
      someEnum = (EnumSet<E>) EnumSet.allOf(Enum1.class);                           
      break;                                       
     case 2:                                       
      someEnum = (EnumSet<E>) EnumSet.allOf(Enum2.class);                           
      break;                                       
     default:                                       
     }                                         

    } 


    public EnumSet<? extends EnumInterface> getEnum() {                             
     return someEnum;                                     
    }  

} 

Testing:

public static void main(String[] args) {                                
    SomeClass c = new SomeClass();                                  
    c.setEnumType(2);                                     
    EnumSet<? extends EnumInterface> e = c.getEnum();                             
    System.out.println(e);                                    

    for (EnumInterface ei : e)                                   
     ei.someMethod();                                    

    }                                          

} 
+0

Хммм, это, похоже, выполняет то, что я хочу сделать. Только один вопрос. Какое предупреждение выдается компилятором и почему вы его подавляете? Нечего беспокоиться, не так ли? Извините мое невежество, Это первый раз, когда я вижу один из них. – ShadowGeist

+0

Непроверенный родовой тип. – Mordechai

+0

Не имеет смысла иметь общий метод, в котором параметр типа не используется в параметрах или возвращаемых типах. – newacct

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