如何将异步接口连接到GWT.create?

时间:2014-10-12 20:40:07

标签: gwt

当我使用GWT 2.6创建示例项目时,我最终得到以下RPC代理初始化代码:

private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);

GreetingService定义为:

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {
    String greetServer(String name) throws IllegalArgumentException;
}

和GreetingServiceAsync定义为:

public interface GreetingServiceAsync {
    void greetServer(String input, AsyncCallback<String> callback)
            throws IllegalArgumentException;
}

GWT.Create的签名是:

public static <T> T create(Class<?> classLiteral)

鉴于所有这些,我希望将greetingService的GWT.create赋值为失败。因为greetingService的类型为GreetingServiceAsync,而GWT.create将返回与Async版本无关的GreetingService。我希望Java编译器将此赋值标记为无效,但它没有这样做。

Async接口与非异步版本之间的链接在哪里? Java编译器显然知道这一点,但我在项目源代码中看不到它。

1 个答案:

答案 0 :(得分:0)

  1. 关于它编译没有错误的事实:注意GWT.create()的参数类型如何不使用T类型参数;所以签名说的是:你可以传递任何类,它可以返回任何类型的对象(TT extends Object的简写),{之间没有连接 {1}}作为参数传递,GreetingService.class返回,至少不在GreetingServiceAsync方法签名中。

  2. 连接位于GWT编译器中(实际上,在RPC的生成器中,为传递给GWT.create()的每个传递GWT.create()的类触发,它只是基于命名规则:返回名称为后缀为RemoteService的参数类的类型。当然会进行检查:两者都必须是接口,并且async接口中的方法必须与“非异步”接口中的方法相同,除非将非异步的返回类型移动到类型参数一个额外的Async参数。顺便说一下,这个特例是AsyncCallback仍然有这个签名的唯一原因,其中返回类型与参数类型无关。