当我使用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编译器显然知道这一点,但我在项目源代码中看不到它。
答案 0 :(得分:0)
关于它编译没有错误的事实:注意GWT.create()
的参数类型如何不使用T
类型参数;所以签名说的是:你可以传递任何类,它可以返回任何类型的对象(T
是T extends Object
的简写),{之间没有连接 {1}}作为参数传递,GreetingService.class
返回,至少不在GreetingServiceAsync
方法签名中。
连接位于GWT编译器中(实际上,在RPC的生成器中,为传递给GWT.create()
的每个传递GWT.create()
的类触发,它只是基于命名规则:返回名称为后缀为RemoteService
的参数类的类型。当然会进行检查:两者都必须是接口,并且async接口中的方法必须与“非异步”接口中的方法相同,除非将非异步的返回类型移动到类型参数一个额外的Async
参数。顺便说一下,这个特例是AsyncCallback
仍然有这个签名的唯一原因,其中返回类型与参数类型无关。