我正在开发一个自定义窗口小部件,我正在调用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
,确保对传入的类进行检查,并将其强制转换为从getter返回的值,但这似乎比正确的方法更具解决方法。(作为奖励,如果可能,我还希望能够在UiBinder甚至GWT Designer中编辑此属性。)
怎么做到呢?
最佳答案
是否使整个窗口小部件类通用是您的选择?如果是这样,这应该起作用:
public class GenericBinderComposite<T extends Enum<?> & HasDisplayText> extends Composite {
private static GenericBinderCompositeUiBinder uiBinder = GWT.create(GenericBinderCompositeUiBinder.class);
interface GenericBinderCompositeUiBinder extends UiBinder<Widget, GenericBinderComposite<?>> {}
private T enumClass;
public GenericBinderComposite() {
initWidget(uiBinder.createAndBindUi(this));
}
public T getEnumClass() {
return enumClass;
}
public void setEnumClass(T enumClass) {
this.enumClass = enumClass;
}
}
当然,以上暗示了
GenericBinderComposite.ui.xml
的存在。