Я работаю над пользовательским виджетом, который я называю SelectionField
, который (вкратце) добавляет функциональность к ListBox
, главным образом для поддержки нашего интерфейса HasDisplayText
. Вот метод, который объяснит, что я имею в виду:
public <T extends Enum<?> & HasDisplayText> void addItems(T [] items) {
if (items != null && items.length > 0) {
for (T item : items) {
selectionField.addItem(item.getDisplayText(), item.name());
}
}
}
Я называю этот метод так:
selectionField.addItems(TimeZone.values());
Я хотел бы иметь свойство (с getter / setter) enumClass
, которое позволяет пользователю вызывать setEnumClass(TimeZone)
. У меня возникают проблемы с выяснением, как это можно сделать, при этом гарантируя, что входящий класс Enum определенно реализует HasDisplayText
.
Это работает:
public <T extends Enum<?> & HasDisplayText> void setEnumClass(Class<T> enumClass) {
if (enumClass != null) {
T[] constants = enumClass.getEnumConstants();
addItems(constants);
}
}
... но теперь я хотел бы объявить поле члена this.enumClass
, чтобы оно могло быть установлено на входящее enumClass
. Очевидно, private <T extends Enum<?> & HasDisplayText> Class<T> enumClass
не работает. Я могу просто объявить поле как private Class<?> enumClass
, обязательно выполнить проверку входящего класса и привести его к возвращению из метода получения, но это выглядит скорее как обходной путь, чем правильный подход.
(В качестве бонуса я также хотел бы иметь возможность редактировать это свойство в UiBinder или даже в GWT Designer, если это возможно.)
Как это можно сделать?