1

我有以下情况。我的 UI 表单上有两个组合,一个显示蔬菜列表,另一个显示水果列表。

在我的支持视图类中,我想声明这样的方法:

@UiFactory
SimpleComboBox<Vegetable> createVegetablesCombo() {
    return vegetables;
}

@UiFactory
SimpleComboBox<Fruit> createFruitsCombo() {
    return fruits;
}

但似乎 GWT 无法识别参数化的返回类型......每次我得到一个错误:

ERROR: Duplicate factory in class VegetablesAndFruitsView  for type SimpleComboBox.

有可能处理这种情况吗?一个 UI 表单上有多个组合框的好例子吗?

4

1 回答 1

3

从运行时的 Java(不是 GWT,不是 UiBinder,而是 Java 语言本身)的角度来看,SimpleComboBox<Vegetable>SimpleComboBox<Fruit>. 也就是说,这个错误来自 UiBinder 的代码生成,它正在寻找所有@UiConstructor方法,并使用它们来构建东西。

那么 UiBinder 必须使用什么?在 UiBinder XML 中,没有泛型。UiBinder 能够做到这一点的唯一方法是,如果你碰巧@UiField在你的类中包含了一个具有适当泛型的条目。这将需要@UiField任何时候可能存在这样的歧义的注释,这是 GWT 目前不做的事情。

你想在这方面达到什么目的?您正在返回一个字段(vegetablesfruits) - 为什么该字段不被标记为@UiField(provided=true)?然后,您可以从 UiBinder 中使用您为分配这些字段所做的任何接线,而根本不需要这些@UiConstructor方法。

@UiField(provided=true)
SimpleComboBox<Fruit> fruits;

//...

public MyWidget() {
  fruits = new SimpleComboBox<Fruit>(...);

  binder.createAndBind(this);
}

...

<form:SimpleComboBox ui:field="fruits" />

如果这只是过度简化,并且您实际上计划在这些方法中创建新对象,那么请考虑传入一个参数,例如String type,并根据值返回一个不同SimpleComboBox<?>的值。从您的 UiBinder xml 中,您可以像这样创建正确的东西:

<field:SimpleComboBox type="fruit" />
于 2013-02-13T02:32:19.470 回答