меня есть интерфейсИспользование EnumSet из перечисления, реализующий интерфейс
public interface TerminalSymbol {
// methods ...
}
перечисление
// common usage enum that I need
public enum Common implements TerminalSymbol {
EPSILON;
@Override
// methods ...
}
, и я хотел бы сделать что-то вроде:
enum Term implements TerminalSymbol {
A, B, C, ...
@Override
// methods ...
}
EnumSet<? extends TerminalSymbol> terminalSymbols = EnumSet.allOf(Term.class);
terminalSymbol.add(Common.EPSILON); // this line gives me error
и что ошибка (в моем случае):
The method add(capture#1-of ? extends TerminalSymbol) in the type AbstractCollection<capture#1-of ? extends TerminalSymbol> is not applicable for the arguments (Common)
теперь я знаю, что если я использую Set<SomeInterface>
, я мог бы предотвратить этот тип ошибок (и я мог бы продолжить разработку моего класса, представляющего формальную грамматику), но я бы хотел использовать EnumSet
, потому что он, вероятно, будет более эффективным, чем HashSet
. Как я могу решить эту проблему?
Действительно ли важна эффективность, которую вы пытаетесь использовать 'EnumSet' вместо' HashSet', или это просто ради использования 'EnumSet'? Дженерики мудрые, похоже, что в конечном итоге вы пытаетесь создать какое-то загрязнение кучи, потому что вы создали «Set» из 'Term', но пытаетесь добавить в него экземпляр «Common». –
Да, теперь я понимаю, что если бы мне захотелось добавить add(), мне нужно было добавить символ EPSILON в перечисление символов терминала, но мне нужен этот символ эпсилона в общем перечислении, поэтому мне нужно использовать решение «HashSet»: D –