2014-07-16 20 views
1

我必须为GWT/GXT项目开发一个“通用”wigdet,为此我需要创建一个未知类型的对象实例。我发现了一种在开发模式下完美工作的方法,但只要我尝试编译我的项目并部署它,我会得到一个Only class literals may be used as arguments to GWT.create()错误。GWT.create(clazz)“泛型”方法

这里是我做的一个样本:

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

为什么你叫'.getClass()'上getParameteriedClass()的'的结果。的getClass()' – StriplingWarrior

+0

对不起它不应该有它只是我所做的只是在我张贴此线程一试。我更新了我的问题的代码。 – RadASM

回答

1

有一个在this forum良好措辞的解释:

作为错误消息表示,唯一的类文字可以被传递给GWT.create方法。原因在于所有的GWT.create调用在编译时基本上都是使用延迟绑定规则的模块。因此,所有的类都必须在编译时决定 - 您的代码要求确定该类的运行时。这太迟了,所以无法编译。

GWT是不正确的Java,所以不能总是对待java。这是gwt无法完成的一个例子。 ...

你在做什么?要么你把它变得比它需要的复杂得多,要么你需要编写一个生成器来完成它,而不是采用这种方法。

+1

基本上,我想要做的是,当用户点击我的网格的工具栏添加按钮时,它必须在网格中有一个新条目并开始编辑这个新条目。但问题是,这个网格现在必须能够处理3种不同类型的数据,并且可能会增长。因此,当用户点击按钮时,我想要像GWT.create(clazzM)那样执行上述代码中所示的操作。同样,我在clazz的子类中声明它已经在运行时知道了。不是吗? (另外我的方法在开发模式下工作,为什么在开发模式,而不是在编译部署?) – RadASM

+1

@RadASM:我不知道。我对GWT并不熟悉,但是有可能让你的类将“Factory”对象作为构造函数参数,而不是直接使用类?然后,您传入的工厂对象可以是直接调用'GWT.create()'的匿名类型。这样你仍然可以很好地重用代码,但是你可以避免GWT无法找到文字的问题。 – StriplingWarrior

+0

是的,我想这可能会起作用,我仍然会重复使用代码。谢谢。如果有人能够更详细地解释事情是如何发生的话,那将是值得赞赏的。 – RadASM