我必须开发一个"泛型"对于GWT / GXT项目的wigdet并且这样做我需要创建一个类型未知的对象的实例。我找到了一种在开发模式下完美运行的方法,但是一旦我尝试编译项目并进行部署,我就会收到Only class literals may be used as arguments to GWT.create()
错误。
以下是我的工作示例:
public class GenericEditableGrid<M> extends Grid<M>{
private final ToolBar toolBar = new ToolBar();
private final TextButton newItemButton = new TextButton();
protected GridInlineEditing<M> editing;
private final Class<M> clazzM;
public GenericEditableGrid(Class<M> parametrizedClass, String gridTitle, ListStore<M> listStore, ColumnModel<M> cm) {
super(listStore, cm);
clazzM = parametrizedClass;
// ... then I create my widget
bind();
}
private void bind(){
newItemButton.addSelectHandler(new SelectEvent.SelectHandler() {
@Override
public void onSelect(SelectEvent selectEvent) {
editing.cancelEditing();
// it is the folliwing line which is the problem obviously
M element = GWT.create(clazzM);
getStore().add(0, element);
int index = 0;
editing.startEditing(new Grid.GridCell(getStore().indexOf(element), index));
}
});
}
}
这就是我在子类中使用它的方式:
super(InternationalString.class, gridTitle, new ListStore<InternationalString>(isprops.key()), buildColumnModel());
基本上,我想知道这种方法究竟是什么问题,最终我应该如何做好。
请注意,我的关注不仅仅是让它发挥作用,更重要的是以正确的方式做到这一点。因为我可以使用抽象方法来避免问题,该方法将处理子类中的GWT.create()方法。但这不是我想要的设计,它看起来并不合适。
我不能得到的是这样做之间的区别:
MyClass e = GWT.create(MyClass.class);
和
Class<MyClass> clazz=MyClass.class;
MyClass e = GWT.create(clazz);
因为就我而言,我认为这基本上就是我正在做的事情,它看起来像是一回事。不是吗?
答案 0 :(得分:2)
this forum中有一个措辞谨慎的解释:
如错误消息所示,只有类文字可以传递给GWT.create方法。原因是所有GWT.create调用在编译时基本上都转换为构造函数,使用模块的延迟绑定规则。因此,所有类必须在编译时决定 - 您的代码需要确定at 运行时类。这太晚了,所以无法编译。
GWT不是正确的java,因此不能总是被视为java。这是一个无法在gwt中完成的事例。 ...
你想做什么?你要么使它变得比它需要的复杂得多,要么你需要编写一个生成器来代替它采用这种方法。