2014-05-02 127 views
0

有沒有一種方法可以讓我做這樣的事情:有沒有辦法使用GWT.create(...)來實例化一個泛型類的類?

public class Foo<Bar> { 
    public Bar newBar() { 
     return GWT.create(/* something useful here */); 
    } 
} 

將這工作,例如:

public class Foo<Bar> { 
    public Bar newBar(Class<Bar> prototype) { 
     return GWT.create(prototype); 
    } 
} 

在那裏我會如做new Foo<MyBar>().newBar(MyBar.class)

但是,理想情況下,我甚至不需要傳遞原型對象。

回答

3

在這種情況下,沒有。必須始終使用實際的類文字調用GWT.create方法,永遠不要使用變量/字段/參數。這是因爲GWT.create實際上是new不帶參數的一個特殊的排序,而不會與一個變量是(無反射)工作:

Class<? extends Bar> clazz = ...; 
Bar instance = new clazz;//nope 

的方法GWT.create看起來像一個方法調用,並在它確實是Java,但是當你編譯成JS時,它必須變成構造函數調用,遵循給定排列的特定延遲綁定規則。

+0

GWT.create(Bar)不能正常工作,這太糟糕了。這是不正確的Java語法,並且由於類型擦除,該構造在常規Java中甚至沒有意義,但是GWT編譯器可以提供所有可用的信息,它需要足夠聰明才能正確實現。但我想這是相當附帶的使用情況反正...讓我留下你的答案几天,但是,以防萬一有一個好主意,以另一種方式來實現相同的事情... –

+1

下一次帶着你想做的事,而不是你如何去做;)。實現這種魔術的最好方法仍然是GWT.create,但是在代碼的不同位置,並且有一個生成器爲你實現帶有它所具有的類型細節的'newBar'。考慮UiBinder和各種編輯器驅動程序類型 - 擴展接口,添加通用參數,GWT。創建結果,生成器使用通用參數來完成其餘部分。評論太長以顯示如何去做,但可能值得一試。 –

+0

注意:不要忽略你如何去做,而是帶着問題而不是解決方案。知道你已經嘗試了什麼,可以更容易地建議如何修復它,或者嘗試另一種方法。 –

相關問題