我正在致力於一個定製小部件,我打電話給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中如果可能的話)。
如何能不能做到?
雖然我實際上直接從ListBox擴展'public class SelectionField&HasDisplayText> extends ListBox',這是一個很好的答案。 –