gpt4 book ai didi

java - GWT无法实例化接口(interface),但可以实例化抽象类吗?

转载 作者:行者123 更新时间:2023-11-30 04:00:03 24 4
gpt4 key购买 nike

如果我有以下内容:

public interface GetItemRequest<T extends FooBase>
{
public long getId();
}

public class GetFooRequest implements GetItemRequest<Foo>
{
//snip..
}

public interface GetService extends RemoteService
{
public <T extends FooBase> T get( GetItemRequest<T> request );
}

在服务器上,我有以下执行方法,它通过 GWT-RPC 执行请求:

public class GetServiceImpl<T extends FooBase>
extends RemoteServiceServlet
implements GetSerice<T>

{
public T get( GetItemRequest<T> request)
{
//snip
}
}

这不起作用,并且给出了错误:

Exception: com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: Invalid type signature for com.xxx.GetFooRequest

但是,如果我改变GetItemRequest成为一个抽象类而不是一个接口(interface),即:

public abstract class GetItemRequest<T extends FooBase>
{
public abstract long getId();
}

并且有GetFooRequestGetItemRequest<Foo> 延伸而不是implement那么请求就可以正常工作了。

但奇怪的是,GetFooRequest必须完全抽象才能使其发挥作用。如果我尝试实现任何方法,例如 getId()GetItemRequest而不是 GetFooRequest ,我也遇到了同样的异常。

有人知道这种奇怪行为背后的原因吗?

最佳答案

我已经尝试过您的代码,只需进行一些细微的更改即可正常工作。

您的代码中也存在一些编译错误,可能是由于拼写错误,例如:

GetItemRequest<T extends FooBase>
<小时/>
public class GetServiceImpl<T extends FooBase> extends RemoteServiceServlet implements GetService

请通过以下代码再次验证:

共享:

public abstract class GetItemRequest<T extends FooBase> {
public abstract long getId();
}
<小时/>
import com.google.gwt.user.client.rpc.IsSerializable;
public class GetFooRequest extends GetItemRequest<Foo> implements IsSerializable {
@Override
public long getId() {
return 0;
}
}
<小时/>
import com.google.gwt.user.client.rpc.IsSerializable;
public class FooBase implements IsSerializable{
...
}
<小时/>
public class Foo extends FooBase{
...
}

客户:

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.gwt.test.shared.FooBase;
import com.gwt.test.shared.GetItemRequest;
@RemoteServiceRelativePath("get")
public interface GetService extends RemoteService {
public <T extends FooBase> T get(GetItemRequest<T> request);
}
<小时/>
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwt.test.shared.FooBase;
import com.gwt.test.shared.GetItemRequest;
public interface GetServiceAsync {
void get(GetItemRequest request, AsyncCallback<FooBase> callback);
}
<小时/>
public void onModuleLoad() {

GetServiceAsync getService = GWT.create(GetService.class);

getService.get(new GetFooRequest(), new AsyncCallback<FooBase>() {

@Override
public void onFailure(Throwable caught) {
System.out.println("failure");
}

@Override
public void onSuccess(FooBase result) {
System.out.println("success");
}

});

...
}

服务器:

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.gwt.test.client.GetService;
import com.gwt.test.shared.Foo;
import com.gwt.test.shared.FooBase;
import com.gwt.test.shared.GetItemRequest;
public class GetServiceImpl<T extends FooBase> extends RemoteServiceServlet implements GetService {
@Override
public <T extends FooBase> T get(GetItemRequest<T> request) {
...
}
}

web.xml:

  <servlet>
<servlet-name>getServlet</servlet-name>
<servlet-class>com.x.y.z.server.GetServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>getServlet</servlet-name>
<url-pattern>/context_root/get</url-pattern>
</servlet-mapping>

关于java - GWT无法实例化接口(interface),但可以实例化抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com