GWT.create(clazz)“泛型”方法

时间:2014-07-16 20:10:03

标签: java generics gwt

我必须开发一个"泛型"对于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);

因为就我而言,我认为这基本上就是我正在做的事情,它看起来像是一回事。不是吗?

1 个答案:

答案 0 :(得分:2)

this forum中有一个措辞谨慎的解释:

  

如错误消息所示,只有类文字可以传递给GWT.create方法。原因是所有GWT.create调用在编译时基本上都转换为构造函数,使用模块的延迟绑定规则。因此,所有类必须在编译时决定 - 您的代码需要确定at 运行时类。这太晚了,所以无法编译。

     

GWT不是正确的java,因此不能总是被视为java。这是一个无法在gwt中完成的事例。 ...

     

你想做什么?你要么使它变得比它需要的复杂得多,要么你需要编写一个生成器来代替它采用这种方法。