G'day, я стремился создать абстрактный (базовый) класс extend -ing EnumMap
. У меня уже есть прототип кода, который отлично работает на основе подкласса EnumMap
, и я хочу преобразовать его в общую базу, которую я могу использовать с разными типами Enum (то есть общий Enum<K>
).Как создать общий класс Enum <K>, который расширяет EnumMap и вызывает super (K.class)?
Дорога-блок я ударил это ...
- Как рассказать
EnumMap
конструктор класса родовогоEnum<K>
?
Для сравнения рабочий (не общий) класс выглядеть следующим образом, учитывая Enum<States>
:
public class MyMap extends EnumMap<States, FocusTraversalPolicy>
{
private static States DEFAULT_POLICY;
private static States currentPolicy = DEFAULT_FLOW;
public MyMap(){
this(States.DATA_INPUT);
}
public MyMap (final ProcessState defaultPolicy ){
super(States.class);
DEFAULT_POLICY = defaultPolicy;
currentPolicy = DEFAULT_FLOW;
}
}
Моя способность переводить это в дженерика ударил набор альтернативных ошибок, закипает вплоть до сложности передачи типа Enum (K.class
) в родительский конструктор EnumMap, а именно:
Cannot select from type variable
и (кратко)
No suitable constructor found ...
argument mismatch; Class<CAP#1> cannot be converted to Class<K>)
Моя декларация до сих пор выглядит следующим образом:
public abstract class MapBase<K> extends EnumMap<K, FocusTraversalPolicy>{
private K DEFAULT_POLICY;
private K currentPolicy;
private Enum Dummy {
NOTHING
}
private MapBase() { // disable empty constructor
this(Dummy.NOTHING); // Exclude NullPointerException-s
}
public MapBase(final K defaultPolicy) // Default compulsory
{
super(K.class); // <-- Cannot select from type variable
// OR
super(defaultPolicy.getClass()); // <-- No suitable constructor found
DEFAULT_POLICY = defaultPolicy;
currentPolicy = DEFAULT_FLOW;
}
}
Это, насколько я получил. Я попытался несколько вариантов с более или менее разными способами сказать мне то же самое, например.
class MapBase<K extends Enum<K>>
extends EnumMap<K, FocusTraversalPolicy>{
:
}
В то время как версия универсалов для базового класса является наиболее желательной, кажется, что это может быть невозможно; или что я не следую правильному синтаксису, чтобы сделать «вид« базового класса, который я хочу.
Даже если знать, если «Вы не можете этого сделать.« Полезен, и я отвлеку свои усилия на другую структуру. Это просто кажется более OO до inherit
против повторного изобретения совершенно хорошего существующего прототипа колеса. Я очень благодарен.
Я исправил ваше форматирование. Пожалуйста, обратите внимание на предварительный просмотр при редактировании и просмотрите сообщение после сохранения. –
Это выглядит серьезно неправильно: расширение EnumMap с использованием одного (то есть делегирование EnumMap), использование заглавного поля без конца в all-caps, инициализация статического поля из конструктора, попытка размещения экземпляра Dummy в переменной типа K Забудьте о своем желаемом дизайне какое-то время и сообщите нам, чего вы пытаетесь достичь, потому что, вероятно, лучший способ. –
Что относительно состава над наследованием? – efekctive