2011-08-11 3 views
3

내 GWT 프로젝트에서 여러 오버레이 (JavaScriptObject)간에 동일한 인터페이스를 구현해야합니다. 문서에 따르면 Gwt - 어떻게 오버레이 (JavaScriptObject)를 실제 Java 객체로 "캐스트"할 수 있습니까?

: JavaScriptObject 하위 유형이 인터페이스를 구현하는

는 GWT 2.0을 시작으로, 그것은 허용된다. 인터페이스에 정의 된 모든 메소드는 JavaScriptObject 하위 유형에서 선언 된 하나 이상의 메소드에 맵핑 될 수 있습니다. 실질적으로 이는 하나의 JavaScriptObject 유형 만 주어진 인터페이스를 구현할 수 있음을 의미하지만 비 JavaScriptObject 유형도 해당 인터페이스를 구현할 수 있습니다.

그래서 JavaScriptObject를 실제 Java 객체로 "캐스팅"하고 싶습니다. 이를 통해 상당량의 중복 코드를 줄일 수 있습니다.

가능합니까? 감사합니다. .

답변

1

JSO를 상속하는 대신에 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

관련 문제