у меня есть интерфейс
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
s, но пытаетесь добавить в него экземплярCommon
. - person Bhesh Gurung   schedule 16.05.2013HashSet
: D - person Mega-X   schedule 16.05.2013