2014-01-10 4 views
2

У меня есть два перечисления, которые реализуют общий интерфейс. Я попытался объявить интерфейс, поэтому только перечисления могут его реализовать.Создание экземпляров наборов общих типов

interface CommonEnumInterface<E extends Enum<?>> { 

    /** It doesn't matter what this does. */ 
    E commonInterfaceMethod(); 

} 

enum Enum1 implements CommonEnumInterface<Enum1> { 
    FOO, 
    BAR, 
    BAZ; 

    @Override 
    public Enum1 commonInterfaceMethod() { 
     return null; 
    } 
} 

enum Enum2 implements CommonEnumInterface<Enum2> { 
    BLAH, 
    YADDA, 
    RHUBARB; 

    @Override 
    public Enum2 commonInterfaceMethod() { 
     return Enum2.BLAH; 
    } 
} 

Теперь я хочу, чтобы объявить параметр универсального типа, который расширяет CommonEnumInterface, который должен подразумевать общий тип также перечисление:

class CreatingGenericEnumSet<E extends Enum<E> & CommonEnumInterface<E>> { 

    CreatingGenericEnumSet() { 

     // Is it possible to instantiate an EnumSet of a generic type? 
     EnumSet<E> enumSet = EnumSet.noneOf(E.class); // Illegal class literal 

     // According to a comment by @tackline, this is illegal, too. 
     Collection<E> hackyVariable = Collections.emptyList(); 
     EnumSet<E> jankyWay = EnumSet.copyOf(hackyVariable); 

    } 
} 

Мой вопрос в приведенном выше комментарии. Есть ли способ, желательно в одной строке, объявить EnumSet общего типа?

Это правильный способ объявить интерфейс и ввести параметры?

+1

Примечание API документацию для 'EnumSet.copyOf (Collection)' 'состояния "IllegalArgumentException' - если 'c' не является' экземпляр EnumSet' и не содержит элементов" , Nasty API. –

+0

Спасибо, @Tom. Я отредактировал свой вопрос. –

ответ

4
class CreatingGenericEnumSet<E extends Enum<E> & CommonEnumInterface<E>> { 

    CreatingGenericEnumSet(Class<E> enumClass) { 

     EnumSet<E> enumSet = EnumSet.<E>noneOf(enumClass); 


    } 
} 

Аналогичный вопрос можно найти here

+0

Это работает. Благодарю. Однако, к сожалению, «трюк», упомянутый в ответе, на который я ссылаюсь, отсутствует. http://stackoverflow.com/a/623691/1450294 Ваш путь может быть единственным способом. –

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