2014-03-05 85 views
1

如果我有以下幾點:GWT無法實例化一個接口,但可以實例化一個抽象類?

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是一個抽象類,而非接口,即:

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

而且具有GetFooRequestGetItemRequest<Foo>而不是implement它擴展,然後請求工作得很好。

然而,奇怪的是,GetFooRequest必須是完全抽象的才能使其工作。如果我嘗試實施任何方法,如getId()GetItemRequest而不是在GetFooRequest,我會得到相同的例外。

有人知道這種奇怪行爲背後的原因嗎?

+0

您的意思是'GetItemRequest '? –

+0

@PaulBellora是的,很好。這是一個錯字,在真正的代碼中它是'T extends FooBase' –

回答

1

我已經試過你的代碼,它的工作很好,但有一些小的改動。

有在你的代碼中的一些編輯錯誤,以及,可能是由於錯字的錯誤,如:

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) { 
     ... 
    } 
} 

網絡。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> 
+0

在我的實際代碼中,我傳遞了一個'Request <?在我的GWT-RPC請求中擴展RequestItem>對象。所以最終傳遞給服務器的是'Request >'。我明白,如果你只是通過'GetItemRequest '它會起作用,但雙泛型似乎會導致GWT提供'無效類型簽名'錯誤。 –

1

在你的代碼中的一些變化,它會開始工作:

實現IsSerializable。

import com.google.gwt.user.client.rpc.IsSerializable; 
public class GetFooRequest implements GetItemRequest<Foo>,IsSerializable 
{ 
    //snip.. 
} 

更改返回類型。

public class GetServiceImpl<T extends FooBase> 
     extends RemoteServiceServlet 
     implements GetSerice<T> 
    { 
    public <T extends FooBase> get(GetItemRequest<T> request) 
    { 
     //snip 
    } 
    } 
+0

但我已經實現了'java.util.Serializable'? –