GWT @UiFactory和参数化返回的类型

时间:2013-02-13 02:13:25

标签: gwt generics

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

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

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

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

但似乎GWT无法识别参数化的返回类型......每次出现错误时:

ERROR: Duplicate factory in class VegetablesAndFruitsView  for type SimpleComboBox.

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

1 个答案:

答案 0 :(得分: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<?>不同的<field:SimpleComboBox type="fruit" /> 价值。从你的UiBinder xml,你可以创建这样的正确的东西:

{{1}}