2011-08-11 48 views
3

在我的GWT項目中,我確實需要在幾個疊加層(JavaScriptObject)之間實現相同的接口。Gwt - 如何將一個疊加層(JavaScriptObject)「轉換成」一個真正的Java對象?

根據文檔:

與GWT 2.0開始,這是允許的JavaScriptObject亞型實現接口。界面中定義的每個方法最多隻能映射一個在JavaScriptObject子類型中聲明的方法。實際上,這意味着只有一個JavaScriptObject類型可以實現任何給定的接口,但任何數量的非JavaScriptObject類型也可以實現該接口。

所以,我想「投」我的JavaScriptObject到一個真正的Java對象。它使我可以大量減少重複代碼。

可能嗎? 謝謝。

回答

1

如何創建包裝JSO而不是對其進行包裝的類?

public class PersonJso extends JavaScriptObject{ 
    protected PersonJso() {} 
    public static native PersonJso create(String name) /*-{ 
     return {name : name}; 
    }-*/; 
    public final native String getName() /*-{ 
     return this.name; 
    }-*/; 
} 

public class AnimalJso extends JavaScriptObject{ 
    protected AnimalJso() {} 
    public static native PersonJso create(String name) /*-{ 
     return {name : name}; 
    }-*/; 
    public final native String getName() /*-{ 
     return this.name; 
    }-*/; 
} 
public class AnimalWrapper implements hasName{ 
    AnimalJso jso; 
    public AnimalWrapper(){} 
    public AnimalWrapper(AnimalJso jso){ 
     this.jso = jso; 
    } 
    @Override 
    public String getName() { 
     return jso.getName(); 
    } 
} 
public class PersonWrapper implements hasName{ 
    PersonJso jso; 
    public PersonWrapper(){} 
    public PersonWrapper(PersonJso jso){ 
     this.jso = jso; 
    } 
    @Override 
    public String getName() { 
     return jso.getName(); 
    } 
} 
+0

是的,我認爲這是一個解決方案,但我必須寫很多包裝(正好是雙!)。你認爲這是獨特的解決方案嗎? –

+0

我猜想另一個解決方法可能是添加您打算用作空體接口的方法並創建CustomJSO。然後重新生成JSO來擴展CustomJSO。這樣您可以編寫一個包裝器,將您的任何JSO包裝爲CustomJSO,以便包裝器可以實現包含已添加到CustomJSO中的方法的任何接口。 – pistolPanties

相關問題