我正在开发一个自定义窗口小部件,我正在调用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的存在。

10-08 16:07