2014-07-16 51 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