У меня есть два перечисления, которые реализуют общий интерфейс. Я попытался объявить интерфейс, поэтому только перечисления могут его реализовать.Создание экземпляров наборов общих типов
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 общего типа?
Это правильный способ объявить интерфейс и ввести параметры?
Примечание API документацию для 'EnumSet.copyOf (Collection)' 'состояния "IllegalArgumentException' - если 'c' не является' экземпляр EnumSet' и не содержит элементов" , Nasty API. –
Спасибо, @Tom. Я отредактировал свой вопрос. –